《并发协程深度解析:asyncio.gather 与 asyncio.wait 的实战对比与最佳实践》

《并发协程深度解析:asyncio.gather 与 asyncio.wait 的实战对比与最佳实践》

一、引言:并发不是并行,但同样精彩

在 Python 的异步编程世界里,asyncio 是一座桥梁,连接着高性能与高可读性。它让我们能够在单线程中高效地调度多个任务,尤其在 I/O 密集型场景中表现出色。

但当我们面对多个协程需要并发执行时,常常会遇到一个选择题:

是用 asyncio.gather,还是 asyncio.wait

这两个 API 看似相似,实则在行为、异常处理、任务取消等方面差异显著。本文将通过真实场景构建、代码示例与行为分析,帮助你理解它们的本质区别,并掌握在不同场景下的最佳使用方式。


二、背景知识:并发协程的调度机制

asyncio 中,协程是异步任务的基本单位。我们可以通过事件循环并发调度多个协程,而不是顺序执行它们。

2.1 asyncio.gather

  • 接收多个协程对象,并发执行,返回一个聚合结果列表。
  • 如果其中一个协程抛出异常,默认会立即传播异常,并取消其他未完成任务。

2.2 asyncio.wait

  • 接收多个协程对象或任务,返回两个集合:donepending
  • 支持更细粒度的控制,如 FIRST_COMPLETEDFIRST_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 抛出异常")
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭渊老黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值