python爬蟲 十三 非同步協程基本的使用

2021-10-07 15:54:38 字數 1765 閱讀 7692

使用協

程,第一

步建立協

程物件\color使用協程,第一步建立協程物件

使用協程,第

一步建立

協程物件第二

步,建立

事件迴圈

物件第二步,建立事件迴圈物件

第二步,建立

事件迴圈

物件 第三步

,把協程

物件註冊

到事件循

環物件去

並執行第三步,把協程物件註冊到事件迴圈物件去並執行

第三步,把協

程物件注

冊到事件

迴圈物件

去並執行

使用async修飾函式讓函式可以返回乙個協程

import asyncio

async def run():

print('開始執行協程內容!')

print('執行完畢!!')

c = run() #獲得乙個協程物件

#建立乙個事件迴圈物件

loop = asyncio.get_event_loop()

#將協程註冊到loop中並啟動loop

loop.run_until_complete(c)

上面就是最基本的協程使用啦!現在來說說task

task物件,基本等同於協程物件,但是可以記錄更多資訊

import asyncio

async def run():

print('開始執行協程內容!')

print('執行完畢!!')

c = run()

loop = asyncio.get_event_loop()

task = loop.create_task(c) #使用loop建立的task物件

loop.run_until_complete(task)

下面是用task物件完成乙個多工非同步協程看看每

個協程之

間的執行

是否是異

步的看看每個協程之間的執行是否是非同步的

看看每個協程

之間的執

行是否是非同步的

import asyncio

import time

async def request(url):

print('開始請求',url)

#假如下面使用time.sleep(2)模擬阻塞操作,會發現耗時不變還是6s

#因為非同步協程中不能出現同步模組的**

await asyncio.sleep(2) #使用await手動掛起

urls =

start = time.time()

loop = asyncio.get_event_loop()

stasks =

for url in urls:

c = request(url)

task = loop.create_task(c)

loop.run_until_complete(asyncio.wait(stasks))

print(time.time()-start)

結果

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

python 協程 爬蟲

協程 又叫微執行緒 python的多執行緒沒法利用多核,只能用乙個核去切換,沒辦法實現真正的並行效果。多執行緒的意義,對於io密集型是有意義的。大部分處理都是io的,多執行緒是可以解決大多數情況的。但是解決不了並行的多程序。協程 非搶占式的程式,執行緒和程序都是搶占式的。協程也是要切換的,不過這種切...

非同步爬蟲 多工非同步協程示例

import asyncio import time async def request url 在非同步協程中如果出現了同步模組相關的 那麼就無法實現非同步 await asyncio.sleep 2 當asyncio中遇到阻塞操作必須進行手動掛起 任務列表,用於存放多個任務物件 stasks f...