2 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
等待調(diào)用,然后在返回類的實(shí)例上調(diào)用該方法。
async def start_doing():
await asyncio.sleep(1)
return Dummy
async def do_something():
thing = await start_doing()
return thing().method()
當(dāng)?shù)却龑?duì)象已經(jīng)等待并且我的對(duì)象已準(zhǔn)備好時(shí),我應(yīng)該如何在將來(lái)調(diào)用對(duì)象方法?如何安排它在未來(lái)被調(diào)用?
看看我能不能弄對(duì)。
當(dāng)您創(chuàng)建任務(wù)do_something時(shí),它會(huì)被安排。
最終事件循環(huán)決定讓我們do_something開(kāi)始。
do_something呼叫start_doing并等待它。
在do_something等待的過(guò)程中,事件循環(huán)將控制權(quán)從它手中奪走,讓其他事情發(fā)生。
在某些時(shí)間點(diǎn)start_doing被調(diào)度,開(kāi)始,完成等待/休眠,返回對(duì)象
在等待/睡眠部分控制可能已通過(guò)事件循環(huán)轉(zhuǎn)移到其他任務(wù)
最終在do_something等待事件循環(huán)完成后將控制權(quán)/焦點(diǎn)交還給它。
暗示其他計(jì)劃任務(wù)已經(jīng)完成或正在等待某事。
我真的不知道調(diào)度算法是什么,我認(rèn)為它是一個(gè)循環(huán)事件,但它可能比這更智能。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
要進(jìn)一步擴(kuò)展@wwii的答案并解決有關(guān)阻塞風(fēng)險(xiǎn)的擔(dān)憂,await
您可以使用以下功能f
:
import time
from datetime import datetime
import asyncio
start = datetime.now()
async def f(x, block_for=3):
print(f"{x} IN {ellapsed_time()}s")
time.sleep(block_for)
print(f"{x} AWAIT {ellapsed_time()}s")
await asyncio.sleep(x)
print(f"{x} OUT {ellapsed_time()}s")
def ellapsed_time():
return (datetime.now() - start).seconds
asyncio.create_task(f(2))
asyncio.create_task(f(1))
哪個(gè)產(chǎn)生:
2 IN 0s
2 AWAIT 3s
1 IN 3s
1 AWAIT 6s
2 OUT 6s
1 OUT 7s
Untilawait被調(diào)用,f(2)正在阻塞(阻止任何其他任務(wù)被調(diào)度)。一旦我們調(diào)用await,我們就明確地通知調(diào)度程序我們正在等待某事(通常是 I/O,但這里只是“睡眠”)。類似地,在它調(diào)用之前f(1)阻止f(2)出去await。
如果我們刪除阻塞部分(阻塞 0s)f(1)將被重新安排到執(zhí)行之前f(2),因此將首先完成:
>>> start = datetime.now()
>>> asyncio.create_task(f(2, block_for=0))
>>> asyncio.create_task(f(1, block_for=0))
2 IN 0s
2 AWAIT 0s
1 IN 0s
1 AWAIT 0s
1 OUT 1s
2 OUT 2s
最后,關(guān)于這部分:
......如何安排它在未來(lái)被調(diào)用?
你可以看看python中的asyncio.sleep()是怎么實(shí)現(xiàn)的?,它可能會(huì)幫助您更好地理解異步編程的工作原理。
添加回答
舉報(bào)