uvloop是基于libuv和cython实现的asyncio事件循环替代品,完全兼容其api,通过将核心逻辑移至c层,使i/o性能提升2–4倍;它必须在任何asyncio事件循环创建前调用uvloop.install()才能生效。

uvloop 是什么,为什么能替换 asyncio 默认事件循环
uvloop 是一个用 Cython 编写的高性能事件循环实现,完全兼容 asyncio 接口,但底层基于 libuv(Node.js 使用的跨平台异步 I/O 库)。它比 CPython 自带的 asyncio.SelectorEventLoop 快 2–4 倍,尤其在高并发短连接、大量 socket 操作场景下提升明显。
关键点在于:它不是“增强”默认循环,而是直接替代——只要在事件循环创建前调用 uvloop.install(),后续所有 asyncio.get_event_loop() 或 asyncio.run() 都会自动使用 uvloop 实例。
如何正确安装并启用 uvloop(含常见失败原因)
最简启用方式只有一行,但顺序和时机极易出错:
- 必须在任何
asyncio事件循环被创建前调用uvloop.install(),例如放在脚本最顶部,或if __name__ == "__main__":的第一行 -
pip install uvloop后,不能在已运行的解释器中动态替换(比如 Jupyter 或交互式终端里先 import asyncio 再装 uvloop) - Windows 上需注意:Python ≥ 3.8 + uvloop ≥ 0.17 才支持,旧版本会抛
RuntimeError: ProactorEventLoop is not supported - 若项目用
asyncio.run(main())启动,uvloop.install()必须在其之前;若手动创建 loop(如asyncio.new_event_loop()),则需显式设置:asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
uvloop 在不同启动方式下的适配写法
不同入口方式对应不同安装位置,否则无效:
- 普通脚本启动:
import uvloop uvloop.install() import asyncio async def main(): await asyncio.sleep(1) asyncio.run(main()) - FastAPI / Starlette 应用:在
main.py顶部加uvloop.install(),Uvicorn 默认会尊重已安装的 policy - 手动管理 loop(少见但必要):
import uvloop import asyncio asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop)
- pytest + pytest-asyncio:需在
conftest.py中提前 install,否则测试用的 loop 仍是默认的
哪些情况 uvloop 反而没用甚至更慢
uvloop 不是银弹,以下场景它几乎不带来收益,甚至可能引入问题:
- CPU 密集型协程(如大量计算、JSON 解析、正则匹配):uvloop 优化的是 I/O 调度开销,不加速纯 Python 计算
- 使用了
asyncio.to_thread()或loop.run_in_executor()的代码:线程池调度不受 uvloop 影响 - 依赖特定 loop 方法的第三方库(极少数):比如硬编码调用
loop._selector.select(),uvloop 没有 selector 属性,会报AttributeError - 调试阶段开启
asyncio.DEBUG:uvloop 的 debug 模式性能下降严重,仅建议开发时临时关闭uvloop.install()来对比行为
真正起效的前提是:你的瓶颈确实在事件循环调度本身,而不是下游服务响应慢、数据库锁表或协程里写了阻塞调用。替换前最好用 asyncio.profiler 或 py-spy record 确认热点。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











