什么是Promise.race相当于在Python异步代码?(What would be Promi

2019-10-16 12:18发布

我想重现Python代码JavaScript的Promise.race行为。 我想同时运行协同程序组并在第一个完成返回,获取其结果并取消/放弃仍在运行的那些结果。

Answer 1:

您可以使用asyncio.wait的说法return_when设置为FIRST_COMPLETED 。 下面的示例代码将打印打印1和异常将永远不会提高。 第二个for循环确保我们所有的未决的协同程序的正确完成。 如果raising_wait协程完成第一,调用后result所创建的任务对象的方法,所述异常将被作为在文件指定上升。 最后要提到的是,在使用asyncio.waitRETURN_FIRST并不能保证我们将在完成设置只有一个任务。

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()


文章来源: What would be Promise.race equivalent in Python asynchronous code?