我想重现Python代码JavaScript的Promise.race行为。 我想同时运行协同程序组并在第一个完成返回,获取其结果并取消/放弃仍在运行的那些结果。
Answer 1:
您可以使用asyncio.wait的说法return_when
设置为FIRST_COMPLETED
。 下面的示例代码将打印打印1
和异常将永远不会提高。 第二个for循环确保我们所有的未决的协同程序的正确完成。 如果raising_wait
协程完成第一,调用后result
所创建的任务对象的方法,所述异常将被作为在文件指定上升。 最后要提到的是,在使用asyncio.wait
与RETURN_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?