python 標準庫學(xué)習(xí)筆記《五》

asyncio

version 3.7.0

可等待對象

攜程

函數(shù)以async修飾,
調(diào)用需在函數(shù)名前加await,直接調(diào)用并不會運行,

async def nested():
    return 42

任務(wù)

任務(wù)創(chuàng)建傳入的函數(shù)必須以async修飾
任務(wù)創(chuàng)建方式 asyncio.create_task(func())
調(diào)用需在任務(wù)名前加await,直接調(diào)用并不會運行,

async def nested():
    return 42
task = asyncio.create_task(nested())

Futures

Future 是一種特殊的 低層級 可等待對象,表示一個異步操作的 最終結(jié)果。
當一個 Future 對象 被等待,這意味著協(xié)程將保持等待直到該 Future 對象在其他地方操作完畢。
在 asyncio 中需要 Future 對象以便允許通過 async/await 使用基于回調(diào)的代碼。
通常情況下 沒有必要 在應(yīng)用層級的代碼中創(chuàng)建 Future 對象。
Future 對象有時會由庫和某些 asyncio API 暴露給用戶,用作可等待對象:

函數(shù)介紹

asynic.run((coroutine, *, debug=False))

執(zhí)行coroutine并返回結(jié)果
當有其他asynico事件循環(huán)在同一線程中運行時,此函數(shù)不能被調(diào)用
如果Debug為True 事件將以調(diào)試模式運行

asyncio.create_task(coroutine)

返回一個Task對象

coroutine asyncio.sleep(delay, result=None, *, loop=None)

休眠

awaitable asyncio.gather(*aws, loop=None, return_exceptions=False)

并發(fā) 運行 aws序列中的 [可等待對象]。
如果 aws中的某個可等待對象為協(xié)程,它將自動作為一個任務(wù)加入日程。
如果所有可等待對象都成功完成,結(jié)果將是一個由所有返回值聚合而成的列表。結(jié)果值的順序與 aws 中可等待對象的順序一致。
如果 return_exceptionsFalse (默認),所引發(fā)的首個異常會立即傳播給等待 gather() 的任務(wù)。aws 序列中的其他可等待對象 不會被取消 并將繼續(xù)運行。
如果 return_exceptions 為 True,異常會和成功的結(jié)果一樣處理,并聚合至結(jié)果列表。
如果 gather() 被取消,所有被提交 (尚未完成) 的可等待對象也會 被取消。

awaitable asyncio.shield(aw, *, loop=None)

保護一個 [可等待對象]
如果 aw 是一個協(xié)程,它將自動作為任務(wù)加入日程。

coroutine asyncio.wait_for(aw, timeout, *, loop=None)

等待 aw 可等待對象 完成,指定 timeout 秒數(shù)后超時。
如果 aw 是一個協(xié)程,它將自動作為任務(wù)加入日程。
timeout 可以為 None,也可以為 float 或 int 型數(shù)值表示的等待秒數(shù)。如果 timeoutNone,則等待直到完成。
如果發(fā)生超時,任務(wù)將取消并引發(fā) asyncio.TimeoutError.
要避免任務(wù) 取消,可以加上 shield()
函數(shù)將等待直到目標對象確實被取消,所以總等待時間可能超過 timeout 指定的秒數(shù)。
如果等待被取消,則 aw 指定的對象也會被取消。

coroutine asyncio.wait(aws, *, loop=None, timeout=None, return_when=ALL_COMPLETED)

并發(fā)運行 aws 指定的 可等待對象 并阻塞線程直到滿足 return_when 指定的條件。
如果 aws 中的某個可等待對象為協(xié)程,它將自動作為任務(wù)加入日程。直接向 wait() 傳入?yún)f(xié)程對象已棄用,因為這會導(dǎo)致 令人迷惑的行為。
返回兩個 Task/Future 集合: (done, pending)

done, pending = await asyncio.wait(aws)

如指定 timeout (float 或 int 類型) 則它將被用于控制返回之前等待的最長秒數(shù)。
請注意此函數(shù)不會引發(fā) asyncio.TimeoutError。當超時發(fā)生時,未完成的 Future 或 Task 將在指定秒數(shù)后被返回。
return_when 指定此函數(shù)應(yīng)在何時返回。它必須為以下常數(shù)之一:

image.png

wait_for()不同,wait() 在超時發(fā)生時不會取消可等待對象

asyncio.as_completed(aws, *, loop=None, timeout=None)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容