python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python asyncio.run() asyncio.gather()

Python asyncio.run() 和 asyncio.gather() 的区别和联系

作者:Geoking.

本文主要介绍 Python 异步编程中 Python asyncio.run() 和 asyncio.gather() 的区别和联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、一句话总结

函数作用调用位置类比理解
asyncio.run()启动并运行整个异步程序(事件循环)🟢 程序入口(只能用一次)“开发动机”
asyncio.gather()在事件循环中并发执行多个协程🟣 事件循环内部“让多辆车一起跑”

二、核心区别详解

1、asyncio.run(): 启动事件循环

✅ 功能

🧩 示例

import asyncio

async def main():
    print("Hello asyncio")

asyncio.run(main())

运行输出:

Hello asyncio

🧭 用法要点

🚫 错误示例

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']

说明:

三、二者的关系(重要)

其实,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()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文