我想在 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()
task_set = set()
task_set.add(loop.create_task(wait(1)))
task_set.add(loop.create_task(raising_wait(2)))
task_set.add(loop.create_task(wait(3)))
done_first, pending = loop.run_until_complete(
asyncio.wait(task_set, 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()
关于javascript - Python 异步代码中的 Promise.race 等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53967281/