本文目录导读:

这是一个很经典的问题,简单直接的回答是:如果你用 Django,选 Gunicorn;如果你用 FastAPI 或纯粹的异步框架,选 Uvicorn。
但实际生产环境中,更常见的答案是:把 Uvicorn 作为 Gunicorn 的 Worker 来使用,即 Gunicorn + Uvicorn Worker 组合。
为了帮你做出选择,下面从几个维度详细对比:
核心区别:同步 vs 异步
| 特性 | Gunicorn | Uvicorn |
|---|---|---|
| 核心模型 | 同步 pre-fork 模型,每个 Worker 运行一个同步 Python 进程。 |
异步 ASGI 服务器,基于 uvloop 和 httptools。 |
| 设计目标 | 稳定、成熟、兼容性强,主要针对 WSGI(Django、Flask)。 | 高性能、原生异步,专门为 ASGI(FastAPI、Starlette、Sanic)设计。 |
| 并发处理 | 依赖多进程 + 线程,对 I/O 密集型请求,需要开很多 Worker 或线程。 | 单进程内事件循环,用协程处理高并发。 |
你应该选哪个?
选 Gunicorn
- 你的框架是 Django 或 Flask(纯 WSGI)。
- 你的代码操作了
threading或multiprocessing(例如数据库 ORM 操作)。 - 你需要极致的稳定性,且对并发量要求不高(比如内部管理系统)。
- 你希望使用成熟的进程管理(自动重启、动态 Worker 数、
--preload)。
选 Uvicorn
- 你的框架是 FastAPI、Starlette 或 Quart(ASGI)。
- 你大量使用
async/await(异步 HTTP 请求、异步数据库驱动如asyncpg、httpx)。 - 你需要处理大量长连接(如 WebSocket、Server-Sent Events)。
- 你希望单机性能压榨到极致。
最佳实践:Gunicorn + Uvicorn Worker
这是 FastAPI 官方推荐的方式,也是生产环境中最常见的部署方案。
原理:Gunicorn 负责进程管理(启动、重启、监听信号、优雅关闭),而 Uvicorn 只是作为一个 Worker 类型,提供 ASGI 兼容性和异步处理能力。
优点:
- 强大的进程管理:Gunicorn 的进程监控、日志、
--reload等功能远超 Uvicorn 自带的管理器。 - 异步处理能力:Uvicorn Worker 内部使用 ASGI,可以处理 WebSocket 和异步代码。
- 兼容性:Gunicorn 主进程是 WSGI 的,但 Worker 可以兼容 ASGI(需要
uvicorn作为 worker 类)。
安装:
pip install gunicorn uvicorn
启动命令(生产环境典型用法):
gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app
-w 4:启动 4 个 Worker 进程。-k uvicorn.workers.UvicornWorker:指定使用 Uvicorn 的 Worker 类。main:app:你的 ASGI 应用入口。
如果你需要 WebSocket 支持,可以用 UvicornWorker 的变体:
gunicorn -w 2 -k uvicorn.workers.UvicornH11Worker main:app
什么时候单独用 Uvicorn?
当你满足以下条件时,可以只用 Uvicorn:
- 你是开发调试阶段(配合
--reload)。 - 你部署在 Docker 容器内,且不需要复杂的进程管理(容器本身已经管理了进程生命周期)。
- 你使用 Kubernetes 等编排工具,由平台负责伸缩。
- 你需要处理 WebSocket 或 HTTP/2(Uvicorn 原生支持更好)。
命令:
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
总结决策树
你的应用是什么?
├── Django / Flask (WSGI)
│ └── 选 Gunicorn ✅
│
├── FastAPI / Starlette (ASGI)
│ ├── 生产环境 / 需要进程管理
│ │ └── Gunicorn + Uvicorn Worker ✅ (最推荐)
│ ├── Docker / K8s 部署
│ │ └── 单独用 Uvicorn ✅
│ └── 开发调试
│ └── 单独用 Uvicorn --reload ✅
│
└── 简单小脚本 / 微服务
└── 单独用 Uvicorn ✅
额外注意点
- 性能:在纯异步场景下,Uvicorn Worker 比 Gunicorn 的同步 Worker 快 20%-50%。
- CPU 密集任务:无论选哪个,都需要用
-w参数启动多个 Worker(进程数 ≤ CPU 核心数),否则会被 GIL 锁死。 - 超时:Gunicorn 默认超时 30 秒(
-t 60可调),Uvicorn 默认无超时,如果你有长时间运行的异步任务(如 AI 推理),用 Uvicorn 更合适。
所以最终建议:用 Gunicorn 启动 Uvicorn Worker,这是目前最平衡、最可靠的方案。