javascript - Python 异步代码中的 Promise.race 等价物是什么?

标签 javascript python asynchronous promise python-asyncio

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

最佳答案

您可以使用 asyncio.wait将参数 return_when 设置为 FIRST_COMPLETED。下面的示例代码将打印 1 并且永远不会引发异常。第二个 for 循环确保我们所有挂起的协程都正确完成。如果 raising_wait 协程先完成,在调用创建的 Task 对象的 result 方法后,将按照文档中的说明引发异常。最后要提到的是,如果协程几乎同时完成,将 asyncio.waitFIRST_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/

相关文章:

javascript - 识别值是否与 jqGrid 数据中的任何键匹配的正确方法是什么?

python - 如何在 MongoEngine 的另一个 EmbeddedDocument 中推送一个 EmbeddedDocument?

python - 生成器函数和异步生成器函数的用途有什么区别

javascript - AngularJS : How to execute function in pre-defined order?

c# - 在 C# 构造函数中等待 AsyncMethod

javascript - 自定义函数的内联输入

javascript - 开发浏览器扩展时的同源策略问题

JavaScript 类型错误 "is not a constructor"

python - 在 C 中模仿 Python 的 strip() 函数

python - 如何在 Tensorflow 中使用逐个事件的权重?