《并发协程深度解析:asyncio.gather 与 asyncio.wait 的实战对比与最佳实践》
一、引言:并发不是并行,但同样精彩
在 Python 的异步编程世界里,asyncio 是一座桥梁,连接着高性能与高可读性。它让我们能够在单线程中高效地调度多个任务,尤其在 I/O 密集型场景中表现出色。
但当我们面对多个协程需要并发执行时,常常会遇到一个选择题:
是用
asyncio.gather,还是asyncio.wait?
这两个 API 看似相似,实则在行为、异常处理、任务取消等方面差异显著。本文将通过真实场景构建、代码示例与行为分析,帮助你理解它们的本质区别,并掌握在不同场景下的最佳使用方式。
二、背景知识:并发协程的调度机制
在 asyncio 中,协程是异步任务的基本单位。我们可以通过事件循环并发调度多个协程,而不是顺序执行它们。
2.1 asyncio.gather
- 接收多个协程对象,并发执行,返回一个聚合结果列表。
- 如果其中一个协程抛出异常,默认会立即传播异常,并取消其他未完成任务。
2.2 asyncio.wait
- 接收多个协程对象或任务,返回两个集合:
done和pending。 - 支持更细粒度的控制,如
FIRST_COMPLETED、FIRST_EXCEPTION等模式。 - 异常不会自动传播,需手动处理。
三、实战场景:模拟并发任务执行与异常处理
3.1 场景设定
假设我们有三个异步任务:
task_a:正常完成task_b:抛出异常task_c:执行时间较长
我们希望并发执行它们,并观察在不同 API 下的行为差异。
四、代码实现与行为分析
4.1 使用 asyncio.gather
import asyncio
async def task_a():
await asyncio.sleep(1)
print("任务 A 完成")
return "A"
async def task_b():
await asyncio.sleep(0.5)
print("任务 B 抛出异常")

最低0.47元/天 解锁文章
361

被折叠的 条评论
为什么被折叠?



