为什么在 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 中对此进行了详细介绍。
假设我们有
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 中对此进行了详细介绍。