爬蟲 單執行緒 多工非同步協程

2022-09-06 05:54:10 字數 1653 閱讀 1785

任務物件

事件迴圈

aiohttp:支援非同步網路請求的模組

伺服器端**:

from flask import flask

import 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 time

import 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...