asyncio 的 coroutine對(duì)象 與 Future對(duì)象使用指南
coroutine 與 Future 的關(guān)系
看起來(lái)兩者是一樣的,因?yàn)槎伎梢杂靡韵碌恼Z(yǔ)法來(lái)異步獲取結(jié)果,
result = await future result = await coroutine
實(shí)際上,coroutine 是生成器函數(shù),它既可以從外部接受參數(shù),也可以產(chǎn)生結(jié)果。使用 coroutine 的好處是,我們可以暫停一個(gè)函數(shù),然后稍后恢復(fù)執(zhí)行。比如在涉及到網(wǎng)路操作的情況下,能夠停下函數(shù)直到響應(yīng)到來(lái)。在停下的這段時(shí)間內(nèi),我們可以切換到其他任務(wù)繼續(xù)執(zhí)行。
而 Future 更像是 Javascript 中的 Promise 對(duì)象。它是一個(gè)占位符,其值會(huì)在將來(lái)被計(jì)算出來(lái)。在上述的例子中,當(dāng)我們?cè)诘却W(wǎng)絡(luò) IO 函數(shù)完成時(shí),函數(shù)會(huì)給我們一個(gè)容器,Promise 會(huì)在完成時(shí)填充該容器。填充完畢后,我們可以用回調(diào)函數(shù)來(lái)獲取實(shí)際結(jié)果。
Task 對(duì)象是 Future 的子類,它將 coroutine 和 Future 聯(lián)系在一起,將 coroutine 封裝成一個(gè) Future 對(duì)象。
一般會(huì)看到兩種任務(wù)啟動(dòng)方法,
tasks = asyncio.gather( asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ) loop.run_until_complete(tasks)
和
tasks = [ asyncio.ensure_future(func1()), asyncio.ensure_future(func2()) ] loop.run_until_complete(asyncio.wait(tasks))
ensure_future 可以將 coroutine 封裝成 Task。asyncio.gather 將一些 Future 和 coroutine 封裝成一個(gè) Future。
asyncio.wait 則本身就是 coroutine。
run_until_complete 既可以接收 Future 對(duì)象,也可以是 coroutine 對(duì)象,
BaseEventLoop.run_until_complete(future) Run until the Future is done. If the argument is a coroutine object, it is wrapped by ensure_future(). Return the Future's result, or raise its exception.
Task 任務(wù)的正確退出方式
在 asyncio 的任務(wù)循環(huán)中,如果使用 CTRL-C 退出的話,即使捕獲了異常,Event Loop 中的任務(wù)會(huì)報(bào)錯(cuò),出現(xiàn)如下的錯(cuò)誤,
Task was destroyed but it is pending!
task: <Task pending coro=<kill_me() done, defined at test.py:5> wait_for=<Future pending cb=[Task._wakeup()]>>
根據(jù)官方文檔,Task 對(duì)象只有在以下幾種情況,會(huì)認(rèn)為是退出,
a result / exception are available, or that the future was cancelled
Task 對(duì)象的 cancel 和其父類 Future 略有不同。當(dāng)調(diào)用 Task.cancel() 后,對(duì)應(yīng) coroutine 會(huì)在事件循環(huán)的下一輪中拋出 CancelledError 異常。使用 Future.cancelled() 并不能立即返回 True(用來(lái)表示任務(wù)結(jié)束),只有在上述異常被處理任務(wù)結(jié)束后才算是 cancelled。
故結(jié)束任務(wù)可以用
for task in asyncio.Task.all_tasks(): task.cancel()
這種方法將所有任務(wù)找出并 cancel。
但 CTRL-C 也會(huì)將事件循環(huán)停止,所以有必要重啟事件循環(huán),
try:
loop.run_until_complete(tasks)
except KeyboardInterrupt as e:
for task in asyncio.Task.all_tasks():
task.cancel()
loop.run_forever() # restart loop
finally:
loop.close()
在每個(gè) Task 中捕獲異常是必要的,如果不確定,可以使用
asyncio.gather(..., return_exceptions=True)
將異常轉(zhuǎn)換為正常的結(jié)果返回。
相關(guān)文章
Python實(shí)現(xiàn)高斯函數(shù)的三維顯示方法
今天小編就為大家分享一篇Python實(shí)現(xiàn)高斯函數(shù)的三維顯示方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python簡(jiǎn)單實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容抓取功能示例
這篇文章主要介紹了Python簡(jiǎn)單實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容抓取功能,結(jié)合實(shí)例形式分析了Python基于urllib模塊的網(wǎng)頁(yè)請(qǐng)求、內(nèi)容讀取等相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
Python爬蟲(chóng)實(shí)戰(zhàn)之用selenium爬取某旅游網(wǎng)站
上一篇我們已經(jīng)知道怎么簡(jiǎn)單使用selenium了,那么我們就從這篇博客來(lái)動(dòng)手爬取網(wǎng)站吧,文中有非常詳細(xì)的代碼示例,需要的朋友可以參考下2021-06-06
解決pandas .to_excel不覆蓋已有sheet的問(wèn)題
今天小編就為大家分享一篇解決pandas .to_excel不覆蓋已有sheet的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Tensorflow tf.nn.depthwise_conv2d如何實(shí)現(xiàn)深度卷積的
這篇文章主要介紹了Tensorflow tf.nn.depthwise_conv2d如何實(shí)現(xiàn)深度卷積的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
使用Python讀取Excel數(shù)據(jù)在PPT中創(chuàng)建圖表
使用Python從Excel讀取數(shù)據(jù)并在PowerPoint幻燈片中創(chuàng)建圖表不僅能夠極大地簡(jiǎn)化圖表創(chuàng)建過(guò)程,通過(guò)Python這一橋梁,我們可以輕松實(shí)現(xiàn)數(shù)據(jù)自動(dòng)化處理和圖表生成,本文將演示如何使用Python讀取Excel數(shù)據(jù)在PPT中創(chuàng)建圖表,需要的朋友可以參考下2024-08-08
Python中CSV文件(逗號(hào)分割)實(shí)戰(zhàn)操作指南
CSV文件默認(rèn)以英文逗號(hào)做為列分隔符,換行符作為行分隔符,下面這篇文章主要給大家介紹了關(guān)于Python中CSV文件(逗號(hào)分割)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
python之wxPython應(yīng)用實(shí)例
這篇文章主要介紹了python之wxPython應(yīng)用實(shí)例,以加載圖片為例講述了wxPython的用法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09
Paddle模型性能分析工具Profiler定位瓶頸點(diǎn)優(yōu)化程序詳解
這篇文章主要為大家介紹了Paddle模型性能分析工具Profiler定位瓶頸點(diǎn)優(yōu)化程序詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Python Flask框架實(shí)現(xiàn)簡(jiǎn)單加法工具過(guò)程解析
這篇文章主要介紹了Python Flask框架實(shí)現(xiàn)簡(jiǎn)單加法工具過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06

