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使用matplotlib绘制折线图的示例代码

    python使用matplotlib绘制折线图的示例代码

    这篇文章主要介绍了python使用matplotlib绘制折线图的示例代码,帮助大家更好的利用matplotlib绘制图形,感兴趣的朋友可以了解下
    2020-09-09
  • MacbookM1 python环境配置随笔

    MacbookM1 python环境配置随笔

    这篇文章主要介绍了MacbookM1 python环境配置随笔,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Python连接mysql方法及常用参数

    Python连接mysql方法及常用参数

    这篇文章主要介绍了Python连接mysql方法及常用参数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 对Python信号处理模块signal详解

    对Python信号处理模块signal详解

    今天小编就为大家分享一篇对Python信号处理模块signal详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Pandas中datetime数据类型的使用

    Pandas中datetime数据类型的使用

    本文主要介绍了Pandas中datetime数据类型的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • Flask如何接收前端ajax传来的表单(包含文件)

    Flask如何接收前端ajax传来的表单(包含文件)

    这篇文章主要介绍了Flask如何接收前端ajax传来的表单(包含文件),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 解析Sentry Relay 二次开发调试

    解析Sentry Relay 二次开发调试

    这篇文章主要介绍了Sentry Relay 二次开发调试简介,集成测试要求 Redis 和 Kafka 在其默认配置中运行,获取所有必需服务的最便捷方式是通过 sentry devservices,这需要最新的 Sentry 开发环境,本文给大家介绍的非常详细,需要的朋友参考下吧
    2022-03-03
  • 深度学习Tensorflow2.8实现GRU文本生成任务详解

    深度学习Tensorflow2.8实现GRU文本生成任务详解

    这篇文章主要为大家介绍了深度学习Tensorflow 2.8 实现 GRU 文本生成任务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • python paramiko实现ssh远程访问的方法

    python paramiko实现ssh远程访问的方法

    这篇文章主要介绍了python paramiko模块实现ssh远程访问的方法,大家参考使用
    2013-12-12
  • Python使用pyinstaller实现学生管理系统流程

    Python使用pyinstaller实现学生管理系统流程

    pyinstaller是一个非常简单的打包python的py文件的库,下面这篇文章主要给大家介绍了关于Python Pyinstaller库安装步骤以及使用方法的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02

最新评论