0

0

Python Uvicorn+Gunicorn 的混合部署方案

冰川箭仙

冰川箭仙

发布时间:2026-02-24 19:56:54

|

869人浏览过

|

来源于php中文网

原创

不能只用uvicorn或gunicorn:uvicorn缺进程管理与平滑重启,gunicorn不原生支持async;需用gunicorn调度+uvicornworker处理,且必须安装uvicorn[standard]、正确配置worker-class和端口参数。

python uvicorn+gunicorn 的混合部署方案

为什么不能只用 Uvicorn 或只用 Gunicorn?

Uvicorn 是纯异步服务器,单进程就能高效处理大量并发请求,但没法自动管理多进程、健康检查、平滑重启;Gunicorn 是老牌 WSGI 服务器,自带进程管理、负载均衡和信号处理,但它原生不支持 async —— 直接跑 async 应用会卡死或报 RuntimeWarning: coroutine 'app' was never awaited

混合部署不是“叠 Buff”,而是让 Gunicorn 做进程调度,Uvicorn 做实际请求处理。关键在:Gunicorn 必须以 uvicorn.workers.UvicornWorker 为工作类,否则就退化成同步模式。

  • 必须安装 uvicorn[standard](带 gunicorn 依赖的版本),否则 UvicornWorker 找不到
  • Gunicorn 配置里不能设 --worker-class sync 或漏掉 --worker-class uvicorn.workers.UvicornWorker
  • uvicorn 自身的命令行参数(如 --host--port)在 Gunicorn 模式下失效,得用 Gunicorn 的 -b 0.0.0.0:8000

如何写一个能被 Gunicorn 正确加载的 ASGI 应用入口?

很多报错如 ImportError: cannot import name 'application' 或启动后 500 且日志里出现 TypeError: 'coroutine' object is not callable,根源都在入口模块没按 ASGI 协议暴露可调用对象。

ASGI 要求入口是一个可调用的 app(函数或实例),接受 scope, receive, send 三个参数。FastAPI/Starlette 默认满足,但手写时容易错。

立即学习Python免费学习笔记(深入)”;

通义万相
通义万相

通义万相,一个不断进化的AI艺术创作大模型

下载
  • 入口文件(如 main.py)末尾必须有 app = ... 这样的赋值,且不能是 async def app(...) —— 那是协程函数,不是 ASGI 应用实例
  • 如果用 async def 写了路由处理函数,没问题;但顶层 app 必须是 Starlette/FastAPI 实例或兼容 ASGI 的 callable
  • 别在入口里直接调 uvicorn.run(),Gunicorn 会自己调用 app,重复启动会端口冲突

示例(app.py):

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

Gunicorn + Uvicorn 启动时最关键的几个配置项

参数配错会导致 CPU 空转、内存暴涨、无法响应 SIGTERM,甚至静默失败。重点不在“多”而在“准”。

  • -w 4:推荐设为 CPU 核心数 × 2,Uvicorn Worker 本身是异步的,每个 worker 可处理大量并发,盲目加 worker 数反而增加上下文切换开销
  • --worker-class uvicorn.workers.UvicornWorker:唯一合法的异步 worker 类,拼错(如少个 U 或写成 uvicorn_worker)会导致回退到同步模式
  • --timeout 120:Uvicorn 默认超时是 60 秒,Gunicorn 默认是 30 秒,建议统一设高些,避免长连接或文件上传中断
  • --graceful-timeout 120:平滑重启时给正在处理的请求留够时间,低于 --timeout 可能导致请求被强制切断
  • 不要加 --preload:它会让每个 worker 进程都提前导入应用,可能引发异步事件循环冲突(如 RuntimeError: There is no current event loop in thread

常见错误现象和定位方法

出问题时别急着改配置,先看日志源头——Gunicorn 日志和 Uvicorn Worker 日志混在一起,但错误类型有规律。

  • 启动就报 ModuleNotFoundError: No module named 'uvicorn.workers':说明 uvicorn 没装对,运行 pip install "uvicorn[standard]" 重装
  • 请求返回 500 且日志里有 TypeError: object NoneType can't be used in 'await' expression:通常是入口 app 没正确定义,或中间件里写了 await None
  • CPU 100% 但无请求进来:大概率是 --worker-class 错了,Gunicorn 在用默认的 sync worker 跑异步应用,死锁了
  • SIGTERM 后进程不退出:检查 --graceful-timeout 是否太短,或应用里有没有没 await 的长任务(比如忘了 await db.execute()

调试时加 --log-level debug--capture-output,把 Uvicorn Worker 的日志也打出来,不然只看 Gunicorn 主进程日志会漏关键信息。

真正麻烦的从来不是怎么配,而是哪个环节悄悄绕过了异步——比如某个同步数据库驱动、某段没 await 的 HTTP 调用、或者日志里一闪而过的 Task was destroyed but it is pending!。这些地方不会报错,但会让整个服务变得不可预测。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

181

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

224

2025.12.18

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

28

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

225

2026.02.06

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

351

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

427

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

789

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

362

2025.07.23

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号