为什么在 Python 中使用 async.gather?

Why use async.gather in Python?

假设我们有

await async_function_one_with_large_IO_request()
await async_function_two_with_large_IO_request()

对比

asyncio.gather(
  async_function_one_with_large_IO_request(), 
  async_function_two_with_large_IO_request())

在第一个版本中,一旦我们点击了功能一的 'large io request' 部分,它就会移动到 运行 function_two,这就是 await 的重点,对吗?

版本 2 的 gather 不也是这样吗?

两者在性能上有什么区别?

In the first version, once we hit the 'large io request' part of function one, it's gonna move onto running function_two, that's the whole point of await, right?

这是不正确的。在您的第一个版本中,async_function_two_with_large_IO_request(我称之为 function_two)在 async_function_one_with_large_IO_request(我称之为 function_one)之前不会 运行 完成.

如果 function_one 在另一个函数上碰巧 await,它将把控制权交给另一个 运行ning 异步任务,但 function_two 尚未安排。

当您使用 asyncio.gather 时,任务是同时安排的,因此如果 function_one await 正在处理某事,function_two 有机会 运行 (以及其他异步任务)。


请注意,asyncio.gather 创建了一个异步任务,这通常意味着您必须 await 在其上:

await asyncio.gather(...)

Python 文档在 Coroutines and Tasks 中对此进行了详细介绍。