为什么在Python 3.12中推荐使用asyncio.Runner管理循环生命周期?

风婷吖_5241

风婷吖_5241

2026-07-03

257人浏览

原创

asyncio.run() 在 python 3.12 中已被弃用,应改用 asyncio.runner;后者支持可重入调用、自动资源清理、与 jupyter 兼容,并避免事件循环泄漏。

为什么在python 3.12中推荐使用asyncio.runner管理循环生命周期?

因为 asyncio.run() 在 Python 3.12 中虽未报错,但已显式发出 DeprecationWarning,且其隐式单次循环模型在 Jupyter、Web 服务、多任务调度等场景下极易引发 RuntimeError 或资源泄漏。

asyncio.run() 在 Python 3.12 中触发 DeprecationWarning

从 Python 3.12 开始,asyncio.run() 调用时会输出明确警告:

DeprecationWarning: asyncio.run() is deprecated since Python 3.12, use asyncio.Runner instead

这不是“未来计划”,而是已生效的弃用标记。它不阻止运行,但意味着:

  • 该函数将在 Python 3.14 或 3.15 中被彻底移除(PEP 705 已确认)
  • 所有 CI/CD 流水线、静态检查工具(如 pyright、mypy)和 linter(如 ruff)默认将其视为潜在问题
  • 警告无法通过 warnings.filterwarnings() 安全忽略——它由 C 层直接抛出,绕过 Python 级过滤

Jupyter / IPython 中必须用 asyncio.Runner

IPython 内核自带一个长期运行的事件循环,asyncio.run() 尝试创建新循环时会直接失败:

RuntimeError: asyncio.run() cannot be called from a running event loop

asyncio.Runner 不依赖全局状态,它内部调用 asyncio.new_event_loop() 并严格隔离生命周期:

Python数据分析(免费版)
Python数据分析(免费版)

提供Python数据清洗、统计分析与可视化建议,覆盖业务报表与科研数据的快速处理流程。

下载
  • 每次 with asyncio.Runner() as runner: 都新建私有循环,与内核循环互不干扰
  • 支持在同一个 notebook 多次执行,不会因前一次未清理导致后续崩溃
  • 无需手动调用 loop.close() —— __exit__ 自动完成清理

需要多次运行协程时,Runner 是唯一安全选择

比如测试多个异步用例、CLI 工具中按子命令分发协程、或 Web 框架中动态加载插件任务:

  • asyncio.run() 第二次调用必然抛 RuntimeError: asyncio.run() cannot be called when another asyncio.run() is already running
  • asyncio.Runner().run() 可重复调用:同一实例可连续执行多个协程,每次返回独立结果
  • 支持传入 loop_factory,例如注入 uvloop.EventLoopPolicy 提升性能

示例:

import asyncio<br>import uvloop<br><br>async def task_a(): return "A"<br>async def task_b(): return "B"<br><br># ✅ 安全、可重入<br>runner = asyncio.Runner(loop_factory=uvloop.new_event_loop)<br>result_a = runner.run(task_a())<br>result_b = runner.run(task_b())<br>runner.close()  # 显式关闭(with 块自动处理)

生产服务中避免 Event Loop 泄漏的关键

长期运行的服务(如 FastAPI 后台任务、异步定时器、连接池管理)若误用 asyncio.run(),会导致:

  • 每次调用都新建循环但未释放底层 selector(尤其在 Linux epoll 或 Windows IOCP 上)
  • 残留未 cancel 的 asyncio.TimerHandle 和 pending callbacks,内存持续增长
  • 日志中出现 ResourceWarning: unclosed event loop 却难以定位源头

asyncio.Runner 把循环生命周期收束到一个对象内,with 语句确保 close() 必然执行,哪怕协程中途 raise 异常 —— 这是 asyncio.run() 完全缺失的保障。

真正容易被忽略的是:Runner 不只是“替代 run() 的写法”,它是把事件循环当作可销毁资源来对待的思维切换。一旦你开始手动管理 loop.create_task()loop.call_soon(),就再也不能假装循环是免费的、无限的、自动回收的了。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1551

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

3624

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1549

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

20677

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2567

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2627

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1063

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

576

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2023

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程