Python asyncio.run() 和 asyncio.gather() 的区别和联系
作者:Geoking.
本文主要介绍 Python 异步编程中 Python asyncio.run() 和 asyncio.gather() 的区别和联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
一、一句话总结
| 函数 | 作用 | 调用位置 | 类比理解 |
|---|---|---|---|
| asyncio.run() | 启动并运行整个异步程序(事件循环) | 🟢 程序入口(只能用一次) | “开发动机” |
| asyncio.gather() | 在事件循环中并发执行多个协程 | 🟣 事件循环内部 | “让多辆车一起跑” |
二、核心区别详解
1、asyncio.run(): 启动事件循环
✅ 功能
- 创建并启动一个新的事件循环(Event Loop)
- 执行指定的顶层协程
- 在协程完成后,自动关闭事件循环
🧩 示例
import asyncio
async def main():
print("Hello asyncio")
asyncio.run(main())
运行输出:
Hello asyncio
🧭 用法要点
asyncio.run()只能在普通函数或脚本入口使用- 在已经运行的事件循环中(如 Jupyter Notebook)不能再次调用
🚫 错误示例
async def inner():
asyncio.run(other()) # ❌ 不行!
会报错:
RuntimeError: asyncio.run() cannot be called from a running event loop
2、asyncio.gather(): 并发执行多个协程
✅ 功能
- 在已经运行的事件循环中,同时调度多个协程执行
- 等待所有协程完成后,返回所有结果
🧩 示例
import asyncio
async def task(name, delay):
await asyncio.sleep(delay)
print(f"{name} 完成")
return name
async def main():
results = await asyncio.gather(
task("任务A", 2),
task("任务B", 1),
)
print("全部完成:", results)
asyncio.run(main())
输出:
任务B 完成
任务A 完成
全部完成: ['任务A', '任务B']
说明:
gather()同时启动多个任务- 自动等待它们全部执行完成
三、二者的关系(重要)
其实,run() 和 gather() 经常是配合使用的:
import asyncio
async def task(n):
await asyncio.sleep(1)
return n
async def main():
# gather 在 run 的内部运行
results = await asyncio.gather(task(1), task(2), task(3))
print(results)
# run 是最外层入口
asyncio.run(main())
执行顺序:
1.asyncio.run() 启动事件循环
2.main() 被执行
3.asyncio.gather() 在循环中同时启动多个任务
4.所有任务完成后返回结果
5.事件循环关闭
四、形象的比喻
| 概念 | 类比 |
|---|---|
| asyncio.run() | 开动车子,启动引擎 |
| async def main() | 定义驾驶计划 |
| asyncio.gather() | 让多个司机同时开不同的车去执行任务 |
五、总结对比表格
| 特性 | asyncio.run() | asyncio.gather() |
|---|---|---|
| 功能 | 启动事件循环并执行主协程 | 并发运行多个协程 |
| 作用范围 | 程序最外层入口 | 程序内部(事件循环中) |
| 是否创建事件循环 | ✅ 是 | ❌ 否 |
| 是否关闭事件循环 | ✅ 自动关闭 | ❌ 不负责 |
| 返回结果 | 主协程的返回值 | 所有协程的返回结果(list/tuple) |
| 可用次数 | 通常只用一次 | 可多次调用 |
| 场景 | 启动异步程序 | 并发执行任务 |
六、小结
| 结论 | 说明 |
|---|---|
| asyncio.run() | 程序入口,用来启动整个异步环境 |
| asyncio.gather() | 运行多个任务,实现真正的并发执行 |
| 二者关系 | run() 启动事件循环,gather() 在循环中调度任务 |
| 使用建议 | 永远只在最外层使用 run(),在内部用 gather() |
到此这篇关于Python asyncio.run() 和 asyncio.gather() 的区别和联系的文章就介绍到这了,更多相关Python asyncio.run() asyncio.gather()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
