asyncio模組中的Future和Task

2022-04-11 08:52:04 字數 1650 閱讀 2625

task是可以理解為單個coroutine,經過ensure_future方法處理而形成,而眾多task所組成的集合經過asyncio.gather處理而形成乙個future。

再不精確的粗略的說,future就是存放著眾多task或future的容器。

而task又是future的子類,所以不管是task還是future還是coreture都可以看成是乙個廣義的攜程,future無非是乙個內部包含眾多攜程的大攜程而已,await後面,task,coroture,future都可以接。

ensure_future 可以將 coroutine 封裝成 task。

asyncio.ensure_future(coro_or_future, *, loop=none)

schedule the execution of a coroutine object: wrap it in a future. return a task object.if the argument is a future, it is returned directly.

import

asyncio

async

defhello(name):

await asyncio.sleep(2)

print('

hello,

', name)

coroutine = hello("

world")

a = asyncio.ensure_future(coroutine)#

print (a.__class__)#

task

b=asyncio.future()#

標準future

print (b.__class__)#

future

print (issubclass(a.__class__,b.__class__))#

true,task類是future類的子類

#首先a是乙個task,又因為task類是futrue類的子類,所以,我們也可以說,a是乙個future

#下面驗證if the argument is a future, it is returned directly.

c=asyncio.ensure_future(b)#

print (c is b)#

true

d=asyncio.ensure_future(a)#

print (d is a)#

true

----------------------------------------分割線----------------------------------------

asyncio.gather 將一些 future 和 coroutine 封裝成乙個 future。

asyncio.wait方法則返回乙個 coroutine。

run_until_complete 既可以接收 future 物件,也可以是 coroutine 物件,如果是coroutine,則先把他轉化為future

baseeventloop.run_until_complete(future)

run until the future is done.

return the future's result, or raise its exception.

python3 非同步模組asyncio

yield方法引入,這裡存在的問題是,如果你想建立從0到1,000,000這樣乙個很大的序列,你不得不建立能容納1,000,000個整數的列表。但是當加入了生成器之後,你可以不用建立完整的序列,你只需要能夠每次儲存乙個整數的記憶體即可。import asyncio asyncio.coroutine...

使用asyncio模組處理檔案報錯

錯誤 valueerror too many file descriptors in select 解決方案 加併發限制semaphore asyncio.semaphore 200 但是只能針對爬蟲調介面semaphore asyncio.semaphore 100 出現這個問題是因為千級檔案操作...

Python中的非同步程式設計 Asyncio

如果你已經決定要理解 python 的非同步部分,歡迎來到我們的 asyncio how to 注 哪怕連異動正規化的存在都不知道的情況下,你也可以成功地使用 python。但是,如果你對底層執行模式感興趣的話,asyncio 絕對值得檢視。非同步是怎麼一回事?在傳統的順序程式設計中,所有傳送給直譯...