欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

asyncio 的 coroutine對象 與 Future對象使用指南

 更新時間:2016年09月11日 10:00:26   投稿:hebedich  
asyncio是Python 3.4版本引入的標(biāo)準(zhǔn)庫,直接內(nèi)置了對異步IO的支持。asyncio的編程模型就是一個消息循環(huán)。今天我們就來詳細(xì)討論下asyncio 中的 coroutine 與 Future對象

coroutine 與 Future 的關(guān)系

看起來兩者是一樣的,因為都可以用以下的語法來異步獲取結(jié)果,

result = await future
result = await coroutine

實際上,coroutine 是生成器函數(shù),它既可以從外部接受參數(shù),也可以產(chǎn)生結(jié)果。使用 coroutine 的好處是,我們可以暫停一個函數(shù),然后稍后恢復(fù)執(zhí)行。比如在涉及到網(wǎng)路操作的情況下,能夠停下函數(shù)直到響應(yīng)到來。在停下的這段時間內(nèi),我們可以切換到其他任務(wù)繼續(xù)執(zhí)行。

而 Future 更像是 Javascript 中的 Promise 對象。它是一個占位符,其值會在將來被計算出來。在上述的例子中,當(dāng)我們在等待網(wǎng)絡(luò) IO 函數(shù)完成時,函數(shù)會給我們一個容器,Promise 會在完成時填充該容器。填充完畢后,我們可以用回調(diào)函數(shù)來獲取實際結(jié)果。

Task 對象是 Future 的子類,它將 coroutine 和 Future 聯(lián)系在一起,將 coroutine 封裝成一個 Future 對象。

一般會看到兩種任務(wù)啟動方法,

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 封裝成一個 Future。

asyncio.wait 則本身就是 coroutine。

run_until_complete 既可以接收 Future 對象,也可以是 coroutine 對象,

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ù)會報錯,出現(xiàn)如下的錯誤,

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 對象只有在以下幾種情況,會認(rèn)為是退出,

a result / exception are available, or that the future was cancelled

Task 對象的 cancel 和其父類 Future 略有不同。當(dāng)調(diào)用 Task.cancel() 后,對應(yīng) coroutine 會在事件循環(huán)的下一輪中拋出 CancelledError 異常。使用 Future.cancelled() 并不能立即返回 True(用來表示任務(wù)結(jié)束),只有在上述異常被處理任務(wù)結(jié)束后才算是 cancelled。

故結(jié)束任務(wù)可以用

for task in asyncio.Task.all_tasks():
  task.cancel()

這種方法將所有任務(wù)找出并 cancel。

但 CTRL-C 也會將事件循環(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()

在每個 Task 中捕獲異常是必要的,如果不確定,可以使用

asyncio.gather(..., return_exceptions=True)

將異常轉(zhuǎn)換為正常的結(jié)果返回。

相關(guān)文章

  • 使用Python將PDF文件轉(zhuǎn)存為圖片的代碼示例

    使用Python將PDF文件轉(zhuǎn)存為圖片的代碼示例

    因工作中的某些奇葩要求,需要將PDF文件的每頁內(nèi)容轉(zhuǎn)存成按順序編號的圖片,用第三方軟件或者在線轉(zhuǎn)換也可以,但批量操作還是Python方便,所以本文給大家介紹了使用Python將PDF文件轉(zhuǎn)存為圖片的方法,需要的朋友可以參考下
    2023-09-09
  • 10個Python常用的損失函數(shù)及代碼實現(xiàn)分享

    10個Python常用的損失函數(shù)及代碼實現(xiàn)分享

    損失函數(shù)是一種衡量模型與數(shù)據(jù)吻合程度的算法。損失函數(shù)測量實際測量值和預(yù)測值之間差距的一種方式。本文為大家總結(jié)了10個常用的損失函數(shù)及Python代碼實現(xiàn),需要的可以參考一下
    2022-09-09
  • python selenium UI自動化解決驗證碼的4種方法

    python selenium UI自動化解決驗證碼的4種方法

    本篇文章主要介紹了python selenium UI自動化解決驗證碼的4種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Python編寫的com組件發(fā)生R6034錯誤的原因與解決辦法

    Python編寫的com組件發(fā)生R6034錯誤的原因與解決辦法

    pythoncom27.dll可能沒有包含manifest信息,或者沒有包含正確的manifest信息,或者系統(tǒng)中的c++ runtime library受到破壞都有可能造成這種現(xiàn)象
    2013-04-04
  • Python3.4學(xué)習(xí)筆記之 idle 清屏擴(kuò)展插件用法分析

    Python3.4學(xué)習(xí)筆記之 idle 清屏擴(kuò)展插件用法分析

    這篇文章主要介紹了Python3.4 idle 清屏擴(kuò)展插件用法,簡單分析了idle清屏的幾種方法及idle清屏插件的相關(guān)使用技巧,需要的朋友可以參考下
    2019-03-03
  • caffe的python接口生成配置文件學(xué)習(xí)

    caffe的python接口生成配置文件學(xué)習(xí)

    這篇文章主要介紹了caffe的python接口生成配置文件學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python中字符串格式化的方法詳解

    Python中字符串格式化的方法詳解

    眾所周知,我們可以使用 print() 方法來輸出一個固定內(nèi)容的字符串,就像是 print("Hello, world!") 一樣,但是,在現(xiàn)實中,我們很多時候是需要輸出一些內(nèi)容不斷變化,或者內(nèi)容動態(tài)生成的字符串,本文將介紹如何按照需要,在Python中格式化一個字符串
    2023-10-10
  • 使用Python實現(xiàn)FTP文件自動傳輸腳本

    使用Python實現(xiàn)FTP文件自動傳輸腳本

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實現(xiàn)FTP文件自動傳輸腳本,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以了解下
    2023-12-12
  • python多線程調(diào)用exit無法退出的解決方法

    python多線程調(diào)用exit無法退出的解決方法

    今天小編就為大家分享一篇python多線程調(diào)用exit無法退出的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python基于Tkinter庫實現(xiàn)簡單文本編輯器實例

    python基于Tkinter庫實現(xiàn)簡單文本編輯器實例

    這篇文章主要介紹了python基于Tkinter庫實現(xiàn)簡單文本編輯器,實例分析了Python使用Tkinter庫實現(xiàn)簡單桌面應(yīng)用程序的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05

最新評論