本文目录导读:

这是一个很经典的问题,简单直接的回答是:如果你用 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,这是目前最平衡、最可靠的方案。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播