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