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

 更新时间:2025年11月24日 11:03:24   作者: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()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python深度学习pytorch神经网络汇聚层理解

    Python深度学习pytorch神经网络汇聚层理解

    通常当我们处理图像时,我们希望逐渐降低隐藏表示的空间分辨率,聚集信息,这样随着我们在神经网络层叠的上升,每个神经元对其敏感的感受野(输入)就越大
    2021-10-10
  • python实战教程之自动扫雷

    python实战教程之自动扫雷

    用python实现扫雷,非常有意思,这篇文章主要给大家介绍了关于python实现自动扫雷的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • pytorch网络模型构建场景的问题介绍

    pytorch网络模型构建场景的问题介绍

    这篇文章主要介绍了pytorch网络模型构建场景的注意点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-03-03
  • Python基于回溯法子集树模板解决最佳作业调度问题示例

    Python基于回溯法子集树模板解决最佳作业调度问题示例

    这篇文章主要介绍了Python基于回溯法子集树模板解决最佳作业调度问题,简单说明了作业调度问题并结合实例形式给出了Python使用回溯法子集树模板实现最佳作业调度问题的具体步骤与相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • Python模块学习之subprocess详解

    Python模块学习之subprocess详解

    subprocess是Python 2.4中新增的一个模块,它允许你生成新的进程,连接到它们的 input/output/error 管道,并获取它们的返回(状态)码,下面小编就来和大家聊聊它的具体使用吧
    2023-08-08
  • 浅谈Python中threading join和setDaemon用法及区别说明

    浅谈Python中threading join和setDaemon用法及区别说明

    这篇文章主要介绍了浅谈Python中threading join和setDaemon用法及区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Pycharm激活方法及详细教程(详细且实用)

    Pycharm激活方法及详细教程(详细且实用)

    这篇文章主要介绍了Pycharm激活方法及详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-05-05
  • Python二维码生成库qrcode安装和使用示例

    Python二维码生成库qrcode安装和使用示例

    这篇文章主要介绍了Python二维码生成库qrcode安装和使用示例,本文讲解了qrcode的安装、生成二维码、生成带图标的二维码等内容,需要的朋友可以参考下
    2014-12-12
  • ActiveMQ:使用Python访问ActiveMQ的方法

    ActiveMQ:使用Python访问ActiveMQ的方法

    今天小编就为大家分享一篇ActiveMQ:使用Python访问ActiveMQ的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python判断字符串是否是回文的方法小结

    python判断字符串是否是回文的方法小结

    回文,英文叫 palindrome,意思是一个字符串,从前往后读 和 从后往前读 是一模一样的,本文给大家介绍了python判断字符串是否是回文的方法小结,需要的朋友可以参考下
    2025-08-08

最新评论