uvloop可将asyncio事件循环吞吐量提升2–4倍,需pip安装并在asyncio.run()前调用uvloop.install()或set_event_loop_policy(uvloop.eventlooppolicy()),避开fork、多进程、调试器等不兼容场景。

uvloop 能让 asyncio 事件循环吞吐量提升 2–4 倍,但不是装上就生效——必须显式替换默认事件循环,并避开 fork、多进程、某些调试工具等破坏 uvloop 兼容性的场景。
如何正确安装并启用 uvloop
uvloop 是 CPython 的 C 扩展,需用 pip 安装,且只支持 Linux/macOS(Windows 不可用)。启用方式不是 import 就完事,而是要在 asyncio.run() 之前调用 uvloop.install(),否则仍走默认 SelectorEventLoop。
- 运行前确保没调用过
asyncio.get_event_loop()或asyncio.new_event_loop(),否则uvloop.install()会静默失败 - 推荐写法:
import uvloop<br>asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())<br>asyncio.run(main())
- 若用
asyncio.run()启动(Python ≥ 3.7),set_event_loop_policy必须在首次run()前执行;放在if __name__ == "__main__":下最安全
哪些 asyncio 模式与 uvloop 不兼容
uvloop 基于 libuv 实现,不支持部分 asyncio 的“兼容性兜底逻辑”,尤其涉及进程、信号和调试时容易出错。
inference.sh 的 Python SDK:运行 AI 应用、构建智能体,并集成 150 多个模型。包名:inferencesh (pip install inferencesh)。支持同步/异步……
- 调用
os.fork()后子进程不能继续用 uvloop,必须在 fork 前切换回默认策略,或 fork 后手动重建 loop - 使用
asyncio.create_subprocess_exec()时,uvloop 对start_new_session=True支持不稳定,建议设为False - 启用
asyncio.debug模式(如python -X dev)会禁用 uvloop,日志里出现"uvloop not available in debug mode" - PyCharm、VS Code 的 Python 调试器默认注入自己的 event loop hook,会导致 uvloop 初始化失败,需在调试配置中禁用 “Gevent compatible” 或勾选 “Use legacy asyncio event loop”
uvloop 在 HTTP 服务中的典型收益与限制
对高并发短连接(如 API 网关、Webhook 接收端)提升明显,但收益取决于 I/O 瓶颈是否真在事件循环层。
- 用
uvicorn --loop uvloop启动 FastAPI/Starlette,默认即启用 uvloop;但若同时开了--reload(开发模式),热重载机制会绕过 uvloop - 用
aiohttp时,需确保ClientSession创建在 uvloop 已安装之后,否则 session 内部仍用默认 loop - 如果瓶颈在 JSON 解析、数据库查询或 CPU 密集型协程(如未用
loop.run_in_executor卸载),换 uvloop 几乎无改善 - 实测:10k 并发 HTTP GET(响应体 1KB),uvloop 相比默认 loop 的 p95 延迟下降约 35%,QPS 上升约 2.8 倍(Linux + Python 3.11)
uvloop 的加速效果高度依赖实际 workload 和系统配置,别只看 benchmark 数字。最常被忽略的是:它只加速 event loop 本身的调度开销,不加速 socket read/write、SSL 握手、DNS 解析这些底层系统调用——那些得靠内核参数、连接池、协议优化来解决。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










