[英]What would be Promise.race equivalent in Python asynchronous code?
我想在 Python 代碼中重現 javascript 的 Promise.race 行為。 我想同時運行一組協程並在第一個協程完成時返回,獲取其結果並取消/丟棄仍在運行的協程的結果。
您可以將asyncio.wait與參數return_when
設置為FIRST_COMPLETED
。 下面的示例代碼將打印1
並且永遠不會引發異常。 第二個 for 循環確保我們所有掛起的協程都正確完成。 如果raising_wait
協程先完成,則在調用創建的 Task 對象的result
方法后,將按照文檔中的說明引發異常。 最后要提到的是,如果協程幾乎在同一時間完成,使用asyncio.wait
和FIRST_COMPLETED
並不能保證我們將有一個任務完成。
from contextlib import suppress
import asyncio
async def wait(t):
await asyncio.sleep(t)
return t
async def raising_wait(t):
await asyncio.sleep(t)
raise TimeoutError("You waited for too long, pal")
loop = asyncio.new_event_loop()
done_first, pending = loop.run_until_complete(
asyncio.wait(
{wait(1), raising_wait(2), wait(3)}, return_when=asyncio.FIRST_COMPLETED
)
)
for coro in done_first:
try:
print(coro.result())
except TimeoutError:
print("cleanup after error before exit")
for p in pending:
p.cancel()
with suppress(asyncio.CancelledError):
loop.run_until_complete(p)
loop.close()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.