Dre*_*ton 7 javascript python asynchronous promise python-asyncio
我想在 Python 代码中重现 javascript 的 Promise.race 行为。我想同时运行一组协程,并在第一个协程完成时返回,获取其结果并取消/丢弃仍在运行的协程的结果。
您可以使用asyncio.wait并将参数return_when设置为FIRST_COMPLETED。下面的示例代码将打印1并且永远不会引发异常。第二个 for 循环确保所有待处理的协程都正确完成。如果raising_wait协程先完成,则在调用result创建的 Task 对象的方法后,将按照文档中的指定引发异常。最后要提到的是,如果协程几乎同时完成,使用asyncio.waitwith 并不能保证我们在完成集中只有一个任务。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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3105 次 |
| 最近记录: |