国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - asyncio 的 coroutine對象 與 Future對象使用指南

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

2020-09-06 12:07腳本之家 Python

asyncio是Python 3.4版本引入的標準庫,直接內(nèi)置了對異步IO的支持。asyncio的編程模型就是一個消息循環(huán)。今天我們就來詳細討論下asyncio 中的 coroutine 與 Future對象

coroutineFuture 的關系

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

?
1
2
result = await future
result = await coroutine

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

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

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

一般會看到兩種任務啟動方法,

?
1
2
3
4
5
tasks = asyncio.gather(
  asyncio.ensure_future(func1()),
  asyncio.ensure_future(func2())
)
loop.run_until_complete(tasks)

?
1
2
3
4
5
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 對象,

?
1
2
3
4
5
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 任務的正確退出方式

在 asyncio 的任務循環(huán)中,如果使用 CTRL-C 退出的話,即使捕獲了異常,Event Loop 中的任務會報錯,出現(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 對象只有在以下幾種情況,會認為是退出,

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

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

故結束任務可以用

?
1
2
for task in asyncio.Task.all_tasks():
  task.cancel()

這種方法將所有任務找出并 cancel。

但 CTRL-C 也會將事件循環(huán)停止,所以有必要重啟事件循環(huán),

?
1
2
3
4
5
6
7
8
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)

將異常轉換為正常的結果返回。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本高清视频在线播放 | 久久91精品 | 日韩一区二区电影 | 国产精品美女视频 | 日韩av在线中文字幕 | 黄p在线看 | 日韩成人在线播放 | 亚色图 | 久久与欧美 | 亚洲国产精品一区 | 日日干夜夜干 | 日日操操| 亚洲国产综合在线观看 | 综合久久综合久久 | 精品成人在线视频 | 欧美福利一区二区 | 国产色视频在线播放 | 精品久久一区二区三区 | 欧美一级在线观看 | 久久久久国产精品午夜一区 | 欧美一区永久视频免费观看 | 亚洲精品免费在线观看视频 | 在线色网站 | a级毛片免费在线 | 国产亚洲精品美女久久久久久久久久 | 久久草视频 | 欧美日在线 | 久久99精品久久久 | 欧美人妖在线 | 欧美操操操 | 色678黄网站全部免费 | 日韩精品一区二区在线观看 | 精品久久久久久久久久久下田 | 人人九九精 | 欧美视频区| 精品无码久久久久久久动漫 | 在线观看av网站永久 | 精品视频一区二区三区在线观看 | 日韩免费在线 | 亚洲欧美网站 | 日本天堂在线 |