在python中等待多个异步函数

Posted

技术标签:

【中文标题】在python中等待多个异步函数【英文标题】:Await multiple async functions in python 【发布时间】:2019-08-16 03:56:06 【问题描述】:

等待多个异步函数并不是真正异步工作,例如,我期望下面的代码在 ~6 秒内运行,但它像同步代码一样运行并在 ~10 秒内执行。 但是当我在 asyncio.gather 中尝试它时,它会在大约 6 秒内执行。

谁能解释为什么会这样?

 #Not working concurrently
 async def async_sleep(n):
    await asyncio.sleep(n+2)
    await asyncio.sleep(n)
start_time = time.time()
asyncio.run(async_sleep(4))
end_time = time.time()
print(end_time-start_time)
#Working concurrently 
async def async_sleep(n):
    await asyncio.gather(asyncio.sleep(n+2),
                    asyncio.sleep(n))

【问题讨论】:

【参考方案1】:

有人可以解释为什么 [gather 比连续等待更快]?

这是设计使然:await x 意味着“在 x 完成之前不要继续这个协程。”如果你一个接一个地放置两个 await,它们自然会顺序执行。如果您想要并行执行,您需要 create tasks 并等待它们完成,或者使用 asyncio.gather 它将为您完成。

【讨论】:

您应该考虑在此处插入示例,而不是指向文档。例如我试过这个await asyncio.gather(task1, task2),它按顺序运行任务,相当并行。我不认为你的说法是正确的。 @Houman asyncio.gather 绝对是为了并行运行。如果您按顺序获取内容,则可能没有等待,即您正在运行同步代码。

以上是关于在python中等待多个异步函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在异步函数中处理多个等待

在 python 中等待之前,不会在异步函数中调用 print 函数

异步等待函数中的 Python asyncio.semaphore

JS的Promise兄弟

python-并发并行同步异步同步锁

python 同步异步,并发并行,同步锁