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

Written by

in

文章目录
  • 函数 作用 调用位置 类比理解 asyncio.run() 启动并运行整个异步程序(事件循环) 🟢 程序入口(只能用一次) “开发动机” asyncio.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()内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Python异步编程之asyncio.create_task()用法示例解析 Python异步编程中asyncio.gather的并发控制详解 Python使用asyncio.Queue进行任务调度的实现 Python Asyncio库之asyncio.task常用函数详解 python 使用事件对象asyncio.Event来同步协程的操作 python中利用队列asyncio.Queue进行通讯详解
  • 目录
    • 一、一句话总结
    • 二、核心区别详解
      • 1、asyncio.run(): 启动事件循环
      • 2、asyncio.gather(): 并发执行多个协程
    • 三、二者的关系(重要)
      • 四、形象的比喻
        • 五、总结对比表格
          • 六、小结

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

            ✅ 功能

            • 创建并启动一个新的事件循环(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
            

            ✅ 功能

            • 已经运行的事件循环中,同时调度多个协程执行
            • 等待所有协程完成后,返回所有结果

            🧩 示例

            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()内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

            您可能感兴趣的文章:

            • Python异步编程之asyncio.create_task()用法示例解析
            • Python异步编程中asyncio.gather的并发控制详解
            • Python使用asyncio.Queue进行任务调度的实现
            • Python Asyncio库之asyncio.task常用函数详解
            • python 使用事件对象asyncio.Event来同步协程的操作
            • python中利用队列asyncio.Queue进行通讯详解

            站内搜索