任務物件
事件迴圈
aiohttp:支援非同步網路請求的模組
伺服器端**:
from flask import flaskimport time
def index_bobo():
time.sleep(2)
return 'hello index1'
def index_jay():
time.sleep(2)
return 'hello index2'
def index_tom():
time.sleep(2)
return 'hello index3'
if __name__ == '__main__':
爬蟲應用:
import timeimport asyncio
s = time.time()
urls = [
'','',
'',]#在特殊函式內部的實現中不可以出現不支援非同步的模組**
async def get_request(url):
#aiohttp:支援非同步網路請求的模組
async with aiohttp.clientsession() as s: #建立乙個aiohttp的clientsession物件
async with await s.get(url=url) as response: #發起aio請求
page_text = await response.text()
print(page_text)
return page_text
tasks =
for url in urls:
c = get_request(url) #協程物件
task = asyncio.ensure_future(c) #將協程物件進一步封裝,即是任務物件 ,任務物件==高階的協程物件==特殊的函式
loop = asyncio.get_event_loop() #建立事件迴圈物件
#注意:掛起操作需要手動處理
loop.run_until_complete(asyncio.wait(tasks)) #事件迴圈物件支援非同步,將任務物件新增到事件迴圈中,啟動事件迴圈,
# 對任務物件進行非同步執行
print(time.time()-s)
附加:基於執行緒池實現非同步爬蟲:
print('總耗時:', time.time() - start)
爬蟲 單執行緒 多工非同步協程
要點 1.resquests模組不支援非同步,在需要非同步的地方使用aiohttp模組進行替換 2.定義乙個協程函式,建立協程任務,將 協程 打包為乙個 task 排入日程準備執行。返回task物件 獲取當前事件迴圈,開啟迴圈 data await response.read 此處參考aiohttp...
單執行緒 非同步協程的簡單爬蟲模型
event loop 事件迴圈,相當於乙個無限迴圈 不清楚迴圈多少次 我們可以把一些特殊函式註冊 放置 到這個事件迴圈上,當滿足某些條件的時候,函式就會被迴圈執行。程式是按照設定的順序從頭執行到尾,執行的次數也是完全按照設定。當在編寫非同步程式時,必然其中有部分程式的執行耗時是比較久的,需要先讓出當...
非同步爬蟲 多工非同步協程示例
import asyncio import time async def request url 在非同步協程中如果出現了同步模組相關的 那麼就無法實現非同步 await asyncio.sleep 2 當asyncio中遇到阻塞操作必須進行手動掛起 任務列表,用於存放多個任務物件 stasks f...