本文目录导读:

Uvicorn 是目前 Python 生态中性能最好的 ASGI 服务器之一,其核心优势源于底层采用 asyncio 事件循环和 httptools(一个高性能的 HTTP 解析器,用 C 语言编写)。
它的性能表现需要从多个维度来看:
绝对性能:非常出色
- 与 Gunicorn 对比: 在直接测试中,单进程的 Uvicorn 通常比多进程/多线程的 Gunicorn(WSGI)快 2-5 倍,这是因为 Uvicorn 原生支持异步,对 CPU 和内存的利用率更高,且避免了 WSGI 服务器的某些开销。
- 与同类 ASGI 服务器对比:
- Uvicorn vs. Daphne: Daphne 是 Django 团队开发的,但性能明显低于 Uvicorn,Uvicorn 通常快 40%-100% 以上。
- Uvicorn vs. Hypercorn: Hypercorn 提供了更多特性(如支持 HTTP/2、WebSocket、Triolo 事件循环),但 Uvicorn 在单个请求/响应场景下通常更快,Hypercorn 的灵活性(特别是对 Triolo 的支持)会带来一些性能损耗。
- 关键瓶颈在应用代码: 当使用 FastAPI、Starlette 等框架时,实际运行时间的 90%-99% 消耗在应用层的 Python 代码中,而不是 Uvicorn 本身,也就是说,Uvicorn 很难成为你应用的瓶颈,除非你每秒处理几万个简单的、无 I/O 的请求。
并发与连接管理
- 长连接(Keep-Alive): Uvicorn 默认支持并高效利用 HTTP Keep-Alive。
- WebSocket: 性能很好,能轻松处理大量并发 WebSocket 连接(数十万级别)。
- HTTP/2: Uvicorn 原生不支持 HTTP/2,如果你需要 HTTP/2,需要搭配 Hypercorn 或使用 Daphne,这是一个重要的限制。
- TLS/SSL: 不建议用 Uvicorn 直接处理 SSL 证书,在生产环境中,强烈建议在前面加一个 Nginx 或反向代理 来处理 SSL 终止和静态文件服务,这样性能更好也更安全。
短板与局限性
- CPU 密集型任务: Uvicorn 本身是单进程、异步事件循环,如果在代码中执行 CPU 密集型的同步代码(如复杂的数学计算、图像处理),整个应用会阻塞,解决方案是:
- 使用
asyncio.to_thread或run_in_executor将任务丢到线程池。 - 真正的终极方案:启动多个 Uvicorn 进程。
gunicorn -w 4 -k uvicorn.workers.UvicornWorker myapp:app这样可以用 Gunicorn 启动 4 个 Uvicorn worker 进程,利用多核 CPU。
- 使用
- 静态文件服务: 性能一般,不算其强项,生产环境务必交给 Nginx。
- 部署复杂性: 它只是一个 ASGI 服务器,不包含进程管理、监控、静态文件等生产级功能。你需要使用 systemd、Supervisor 或 Gunicorn + Uvicorn Worker 的组合来管理它。
基准测试模拟数据(仅供参考)
| 测试场景 | Uvicorn (单进程) | Gunicorn (4 workers, sync) | 说明 |
|---|---|---|---|
| 简单 JSON 响应 | ~25,000 req/s | ~8,000 req/s | 无 I/O,纯 CPU 处理 |
| 延迟 100ms I/O | ~9,500 req/s | ~1,800 req/s | 模拟数据库查询等 |
| 每秒处理 WebSocket | ~50,000 连接数 | N/A | 异步事件循环优势 |
注意:实际数值因硬件、框架、代码复杂度而异,以上数据由主流测试工具(如 wrk、locust)在双核服务器、FastAPI 框架下测得。
它适合你吗?
Uvicorn 非常适合以下场景:
- 使用 FastAPI、Starlette、Quart 等异步框架。
- 应用的核心是高并发 I/O 操作(数据库查询、API 调用、文件读写、WebSocket)。
- 希望获得接近原生的 Python 异步性能。
它不适合:
- 需要 HTTP/2 支持(用 Hypercorn)。
- 应用代码核心是 CPU 密集型任务(考虑使用 Celery 或结合多进程)。
- 追求“开箱即用”的全栈服务器(它依赖其他组件进行进程管理和静态文件服务)。
一句话结论: Uvicorn 本身性能极佳,是针对现代异步 Python web 应用(尤其是 FastAPI)的优选服务器,但它只是拼图的一块,需要搭配进程管理器和反向代理来发挥全部力量。
推荐生产配置: systemd / supervisor + gunicorn -w 4 -k uvicorn.workers.UvicornWorker + Nginx (反向代理 & 静态文件)。