簡體   English   中英

什么是 Promise.race 在 Python 異步代碼中的等價物?

[英]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.waitFIRST_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM