PythonWeb服务器选Gunicorn还是Uvicorn

wen python案例 1

本文目录导读:

PythonWeb服务器选Gunicorn还是Uvicorn

  1. 核心区别:同步 vs 异步
  2. 你应该选哪个?
  3. 最佳实践:Gunicorn + Uvicorn Worker
  4. 什么时候单独用 Uvicorn?
  5. 总结决策树
  6. 额外注意点

这是一个很经典的问题,简单直接的回答是:如果你用 Django,选 Gunicorn;如果你用 FastAPI 或纯粹的异步框架,选 Uvicorn。

但实际生产环境中,更常见的答案是:把 Uvicorn 作为 Gunicorn 的 Worker 来使用,即 Gunicorn + Uvicorn Worker 组合。

为了帮你做出选择,下面从几个维度详细对比:

核心区别:同步 vs 异步

特性 Gunicorn Uvicorn
核心模型 同步 pre-fork 模型,每个 Worker 运行一个同步 Python 进程。 异步 ASGI 服务器,基于 uvloophttptools
设计目标 稳定、成熟、兼容性强,主要针对 WSGI(Django、Flask)。 高性能、原生异步,专门为 ASGI(FastAPI、Starlette、Sanic)设计。
并发处理 依赖多进程 + 线程,对 I/O 密集型请求,需要开很多 Worker 或线程。 单进程内事件循环,用协程处理高并发。

你应该选哪个?

选 Gunicorn

  • 你的框架是 DjangoFlask(纯 WSGI)。
  • 你的代码操作了 threadingmultiprocessing(例如数据库 ORM 操作)。
  • 你需要极致的稳定性,且对并发量要求不高(比如内部管理系统)。
  • 你希望使用成熟的进程管理(自动重启、动态 Worker 数、--preload)。

选 Uvicorn

  • 你的框架是 FastAPIStarletteQuart(ASGI)。
  • 你大量使用 async/await(异步 HTTP 请求、异步数据库驱动如 asyncpghttpx)。
  • 你需要处理大量长连接(如 WebSocket、Server-Sent Events)。
  • 你希望单机性能压榨到极致。

最佳实践:Gunicorn + Uvicorn Worker

这是 FastAPI 官方推荐的方式,也是生产环境中最常见的部署方案。

原理:Gunicorn 负责进程管理(启动、重启、监听信号、优雅关闭),而 Uvicorn 只是作为一个 Worker 类型,提供 ASGI 兼容性和异步处理能力。

优点

  1. 强大的进程管理:Gunicorn 的进程监控、日志、--reload 等功能远超 Uvicorn 自带的管理器。
  2. 异步处理能力:Uvicorn Worker 内部使用 ASGI,可以处理 WebSocket 和异步代码。
  3. 兼容性: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 等编排工具,由平台负责伸缩。
  • 你需要处理 WebSocketHTTP/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 ✅

额外注意点

  1. 性能:在纯异步场景下,Uvicorn Worker 比 Gunicorn 的同步 Worker 快 20%-50%。
  2. CPU 密集任务:无论选哪个,都需要用 -w 参数启动多个 Worker(进程数 ≤ CPU 核心数),否则会被 GIL 锁死。
  3. 超时:Gunicorn 默认超时 30 秒(-t 60 可调),Uvicorn 默认无超时,如果你有长时间运行的异步任务(如 AI 推理),用 Uvicorn 更合适。

所以最终建议:用 Gunicorn 启动 Uvicorn Worker,这是目前最平衡、最可靠的方案。

抱歉,评论功能暂时关闭!