在 python 中等待多个异步函数

Ven*_*Ram 12 python python-asyncio

等待多个异步函数并不是真正的异步工作。

例如,我期望下面运行多个await函数的代码在大约 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)
Run Code Online (Sandbox Code Playgroud)
# Working concurrently 
async def async_sleep(n):
    await asyncio.gather(
        asyncio.sleep(n+2),
        asyncio.sleep(n)
    )
Run Code Online (Sandbox Code Playgroud)

use*_*342 12

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

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

  • @Houman `asyncio.gather` 绝对是为了并行运行。如果您按顺序获取内容,则您可能不会等待,即您正在运行同步代码。 (2认同)