真正的事件循环是asyncio的核心调度器,负责运行协程、处理i/o等;应使用asyncio.run()或get_running_loop()等公开接口操作,避免依赖私有属性_event_loop,因其无文档保障且易随版本变更。

Python 的 _event_loop 并不是官方公开 API,而是 asyncio 内部使用的私有属性或临时变量名,直接访问或依赖它容易出错、不兼容未来版本。 它通常出现在调试、源码阅读或某些非标准用法中,不代表事件循环的正确获取或管理方式。
什么是真正的事件循环?
事件循环(Event Loop)是 asyncio 的核心调度器,负责运行协程、处理 I/O、定时任务和回调。Python 3.7+ 推荐通过标准接口操作:
-
asyncio.get_running_loop():获取当前线程中正在运行的事件循环(必须在协程或事件循环内部调用) -
asyncio.get_event_loop():已弃用(自 Python 3.10 起发出警告),旧代码中可能返回默认循环,但行为不可靠 -
asyncio.new_event_loop():创建全新循环(需手动 set_event_loop,多用于测试或子线程) -
asyncio.run(coro):最安全的入口——自动创建、运行、关闭循环,适合主程序启动
为什么不要碰 _event_loop?
这个名称常见于以下场景,但都属于实现细节:
- CPython 或 asyncio 源码中,如
BaseEventLoop._loop或某些类的私有缓存字段 - 第三方库(如早期版本的 aiohttp、uvloop)内部临时存储,命名不统一且可能变更
- 调试时误读
dir(loop)输出,把下划线开头的属性当公共接口
它没有文档保障,不参与语义版本控制,下个补丁就可能重命名、删除或改行为。
立即学习“Python免费学习笔记(深入)”;
正确获取和管理事件循环的实践
日常开发请坚持使用公开接口:
- 主线程启动协程:直接用
asyncio.run(main()),无需关心循环创建与关闭 - 需要复用循环(如插件系统):用
get_running_loop(),并在协程内调用 - 子线程中运行异步逻辑:显式创建新循环 +
set_event_loop()+ 手动close() - 检查是否在事件循环中:可用
asyncio._get_running_loop() is not None(仅调试,非正式判断)
小结
看到 _event_loop 不要试图赋值、替换或强依赖。它是内部痕迹,不是设计接口。用好 asyncio.run() 和 get_running_loop() 就能覆盖 99% 的需求。稳定性和可维护性,永远比“知道底层怎么存”更重要。









