Python asyncio 并发执行多个协程详解

沿途有光
沿途有光
发布时间:2026-10-12| 1人浏览过
原创

本文详解 Python 中如何利用 asyncio.gather() 函数将多个协程组合并并发执行,重点讲解位置参数传递、列表解包语法、返回值聚合机制及常见报错防范,帮助开发者快速掌握异步任务的批量调度方案。

asyncio.gather() 的核心机制

在 Python 异步编程中,asyncio.gather() 是一个核心实用函数,用于将多个可等待对象(如协程、Future 或 Task)组合在一起进行并发执行。它的主要优势在于允许调用者一次性调度多个任务,并在所有任务完成后统一获取结果,而不是逐个阻塞等待。

该函数将一组可等待对象视为单个整体返回一个 asyncio.Future 对象。一旦调用,事件循环会自动调度这些任务尽快并行运行。开发者无需手动管理底层线程或进程,只需关注业务逻辑的异步编排。

正确使用 asyncio.gather() 的操作步骤

第1步:创建并收集待执行的协程

首先根据业务需求定义具体的异步函数。可以通过循环或列表推导式提前生成协程对象集合。例如,模拟十个耗时相近的独立任务:

import asyncio

async def task_work(value):
    print(f'任务 {value} 启动')
    await asyncio.sleep(1)
    return f'结果 {value}'

# 预先创建协程列表
coros = [task_work(i) for i in range(10)]

第2步:将协程组传入 gather() 函数

asyncio.gather() 接收的是位置参数而非列表。若直接传入列表会导致类型错误,必须使用星号运算符(*)将容器内的对象展开为独立的实参。这是实践中最关键的语法细节:

# 错误写法:直接传入列表
# asyncio.gather(coros) 

# 正确写法:使用解包操作符
asyncio.gather(*coros)

如果传入的对象已经是 Task 实例,它们会在创建时自动注册到事件循环并开始调度。gather() 本身不会阻塞主线程,而是立即返回代表整个任务组的 Future 对象。

第3步:Await 等待执行完毕并提取结果

由于 gather() 返回的是一个未来对象,必须使用 await 关键字暂停当前协程,直到分组内所有任务完成。完成后,它将按传入顺序返回一个包含各任务返回值的列表:

results = await asyncio.gather(*coros)
print('全部完成:', results)

若某个子协程抛出异常且未设置 return_exceptions=True 参数,gather() 会直接中断后续等待并将异常向上传播。对于需要容错处理的场景,建议开启异常捕获模式。

完整并发调度示例与验证

以下脚本整合了上述步骤,展示标准入口点如何批量触发异步任务并确认执行状态:

import asyncio

async def task_work(value):
    print(f'>任务 {value} 执行中')
    await asyncio.sleep(1)
    return f'Done-{value}'

async def main():
    print('主程序启动')
    # 1. 准备阶段
    tasks_list = [task_work(i) for i in range(5)]
    
    # 2. 调度与等待阶段
    results = await asyncio.gather(*tasks_list)
    
    # 3. 结果核对阶段
    print('主程序结束')
    for idx, res in enumerate(results):
        print(f'索引 {idx}: {res}')

asyncio.run(main())

运行上述代码后,控制台将按随机交错顺序打印“执行中”日志,证明五个任务确实在同一时间片内并发运行。当所有休眠结束时,main() 才会恢复执行并输出聚合后的结果列表。这种模式特别适合网络请求批量抓取、文件并行读取等 I/O 密集型场景。

以上就是 Python asyncio gather 同时运行多个协程的详细方法与原理分析,更多关于 Python 异步编程进阶技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。