Uvicorn的--loop参数仅支持auto、asyncio、uvloop三个值,由argparse.choices强制校验;auto为默认,有uvloop则启用否则回退asyncio;uvloop需预装且显式指定才生效。

uvicorn --loop 参数只接受三个值
Uvicorn 的 --loop 参数不是自由输入的字符串,它被硬编码限制为仅支持 auto、asyncio、uvloop 三种取值。传其他值(比如 libuv、eventlet 或拼错的 uvllop)会直接报错退出,提示类似 error: argument --loop: invalid choice: 'xxx'。
这个限制来自 Uvicorn 源码中 argparse 的 choices 参数,也体现在 LOOP_FACTORIES 字典的键集合里。它不是建议,是强制校验。
-
auto是默认值,行为是“有 uvloop 就用,没有就 fallback 到 asyncio”,不抛异常 -
asyncio强制走标准库实现,适合调试或兼容性兜底(比如某些嵌入式 Python 环境) -
uvloop强制启用,但前提是已安装uvloop包;否则启动时会抛ImportError,不是静默降级
uvloop 不是默认启用,必须显式配置
很多人误以为 Uvicorn 默认就用 uvloop,其实不是。Uvicorn 默认用的是标准 asyncio 事件循环——哪怕你已经 pip install uvloop 了,只要不加 --loop uvloop 或 --loop auto,它就不会加载 uvloop。
验证方法很简单:启动时加 --log-level debug,看日志里是否出现 Using uvloop event loop。没这句,就是 asyncio 在跑。
- 用
--loop auto时,Uvicorn 会在启动早期import uvloop,成功才切换 - 用
--loop uvloop时,Uvicorn 会无条件 import,失败即崩,不会尝试 fallback - 不加
--loop参数,等价于--loop auto,但依赖默认值逻辑,不如显式写出来清晰
asyncio vs uvloop 的性能差异在 I/O 密集场景才明显
uvloop 的优势集中在高并发、低延迟、大量短连接或长连接保活的场景,比如 API 网关、实时消息推送、高频爬虫调度器。如果你的应用主要做 JSON 解析、数据库聚合计算或模板渲染,uvloop 带来的提升可能不到 5%,因为瓶颈不在事件循环,而在 CPU。
Uvicorn 0.52.1 是 Python ASGI Web 服务器,提供异步应用服务及 WebSocket 支持,常用于 FastAPI、Starlette 等应用的开发和部署。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理所需依赖。
压测数据可参考:相同硬件下,纯 echo 接口的 RPS,uvloop 可比 asyncio 高 2–4 倍;但若每个请求都带一次 json.loads() + psycopg2 查询,差距会缩到 10–20%。
- 别为了“用了高性能库”而强行上 uvloop,先确认你的瓶颈真在事件循环层
- 用
py-spy record -p $(pgrep uvicorn)抓火焰图,看热点是不是堆在asyncio.selector或uvloop.loop.Loop.run_forever - Windows 下 uvloop 支持有限(尤其 subprocess 场景),生产环境建议优先在 Linux/macOS 测试
多进程模式下,每个 worker 独立事件循环
Uvicorn 的 --workers N 启动的是多个独立子进程,每个 worker 都有自己的事件循环实例。这意味着:
-
--loop uvloop对每个 worker 都生效,不是主进程全局设置 - 如果某个 worker 因 uvloop 初始化失败崩溃,其他 worker 不受影响(但整体可用性下降)
- 内存占用会随 worker 数线性增长,而 uvloop 本身比 asyncio 略重一点,4 workers + uvloop 可能比 4 workers + asyncio 多占 40–60MB
- 不要盲目增加 worker 数来“弥补” uvloop 的缺失——worker 和 loop 是正交配置,该用 uvloop 还得用,该设 2–4 个 worker 也要设
最易被忽略的一点:当你在容器或 systemd 里部署时,--loop auto 在不同环境可能行为不一致——有的镜像预装了 uvloop,有的没装,导致测试和生产行为割裂。生产配置务必显式锁定 --loop uvloop 或 --loop asyncio,并确保基础镜像一致。










