[Web/Python] ASGI : 异步 Python Web 网关服务器
0 序
- 开发 基于 HTTP SSE 模式的 MCP Server/Tool 时,偶然了解到其 Fast API Server 底层 是 ASGI 技术,故此了解一二。
1 概述: ASGI 技术
ASGI(Asynchronous Server Gateway Interface)Server 是现代 Python 异步 Web 应用的核心基础设施。
什么是 ASGI?
- ASGI 是 Python 异步服务器网关接口标准,由
Django团队于 2016 年提出,作为WSGI(Web Server Gateway Interface)的继任者。
| 特性 | WSGI | ASGI |
|---|---|---|
| 同步/异步 | 仅支持同步 | 原生支持异步 |
| 协议支持 | 仅 HTTP/1.1 | HTTP/1.1、HTTP/2、WebSocket、gRPC 等 |
| 长连接 | 不支持 | 完美支持 |
| 典型框架 | Django、Flask | FastAPI、Django Channels、Quart |
ASGI Server 的核心作用
ASGI Server 是应用服务器,负责:
- 接收客户端连接(HTTP/WebSocket)
- 解析协议并封装为 ASGI 标准消息格式
- 调用你的 ASGI 应用(如 FastAPI 实例)
- 返回响应给客户端
- 它类似于 WSGI 时代的 Gunicorn/uWSGI,但专为异步架构设计。
主流 ASGI Server 对比
1. Uvicorn (最流行)
- 基于
uvloop(高性能事件循环)和httptools(C 语言 HTTP 解析器) - 特点:纯 Python 实现,性能极高,生态最完善
- 使用:
uvicorn main:app --host 0.0.0.0 --port 8000 - 适用:绝大多数 FastAPI/Starlette 项目
2. Hypercorn
- 支持 HTTP/1、HTTP/2、HTTP/3 和 WebSocket
- 特点:协议支持最全,支持 Trio 和 asyncio 两种异步模式
- 适用:需要 HTTP/2 或 HTTP/3 的场景
3. Daphne
- Django 官方 ASGI Server
- 特点:与 Django Channels 深度集成
- 适用:Django 异步项目
4. Granian
- 基于 Rust 编写的高性能 ASGI Server
- 特点:用 Rust 处理 HTTP 解析,理论性能比 Uvicorn 更高
- 适用:追求极致性能的场景
架构示意
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Nginx │────▶│ ASGI Server │────▶│ ASGI App │
│ (反向代理) │ │ (Uvicorn) │ │ (FastAPI) │
└─────────────┘ └─────────────┘ └─────────────┘
│
┌──────┴──────┐
▼ ▼
┌─────────┐ ┌─────────┐
│ 路由分发 │ │ 业务逻辑 │
│ (Starlette)│ │ (Endpoints)│
└─────────┘ └─────────┘
实际使用示例
生产环境部署(Uvicorn + Gunicorn)
# Gunicorn 作为进程管理器,Uvicorn worker 处理请求
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
纯 Uvicorn 开发
# 热重载模式
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# 生产模式(多 worker)
uvicorn main:app --workers 4 --host 0.0.0.0 --port 8000
为什么需要 ASGI Server?
- Python 的 async/await:充分利用异步 I/O,单线程处理数千并发连接
- WebSocket 支持:实时通信(聊天、推送、游戏)的基础设施
- 现代协议:HTTP/2 多路复用、Server Push 等
- 微服务架构:高性能网关,适合容器化部署(Docker/K8s)
简单总结
-
ASGI Server 是 Python 异步 Web 世界的"发动机",Uvicorn 是目前的事实标准,它让你的 FastAPI/Django Channels 应用能够高效处理高并发请求和实时连接。
-
如果有具体的部署场景(如 Docker、Kubernetes、搭配 Nginx 等),可以再进一步探讨最佳实践。
Z FAQ for ASGI
Q:基于 ASGI 技术的 Python Web框架: Uvicorn ,与 Java 的 Web 框架 Spring Boot,二者性能对比?
- 这是一个经典的跨语言 Web 框架性能对比问题。
- 基于 TechEmpower 等权威基准测试数据,Uvicorn + FastAPI 与 Spring Boot 的性能对比可以大致总结为:
仅供参考,非严格测试。
核心性能对比(TechEmpower 基准测试)
| 指标 | Uvicorn + FastAPI | Spring Boot | 备注 |
|---|---|---|---|
| 纯 JSON 序列化 | ~22,000+ req/s | 视配置而定 | FastAPI 是 Python 生态最快框架之一 |
| 数据库查询(单条) | ~4,193-4,831 req/s | ~7,886 req/s (JDBC) | Spring Boot + JDBC 领先 |
| 数据库查询(JPA) | 显著领先 | ~844 req/s | FastAPI 异步优势明显 |
| 并发模型 | 单线程异步 (asyncio) | 多线程阻塞 / WebFlux 异步 | 不同场景各有优势 |
关键结论
1. I/O 密集型场景:FastAPI 胜
- FastAPI + Uvicorn 在 高并发连接、WebSocket、流式处理 等异步 I/O 场景下表现优异
- 单实例可轻松处理 数千并发连接,内存占用极低
2. 数据库操作:取决于驱动
- Spring Boot + JDBC:传统阻塞式数据库访问性能强劲(~7,886 req/s)
- FastAPI + asyncpg:异步 PostgreSQL 驱动下可达 ~4,800 req/s,但使用同步驱动(psycopg2)性能骤降
- Spring Boot + JPA:Hibernate 开销大,性能明显落后(~844 req/s)
3. CPU 密集型计算:Spring Boot 胜
- Java JVM 在纯计算、复杂业务逻辑处理上更具优势
- Python GIL 限制 CPU 密集型任务性能
架构差异
| 维度 | Uvicorn (ASGI) | Spring Boot (Servlet/Reactive) |
|---|---|---|
| 运行时 | Python + uvloop (Cython) | JVM |
| 启动速度 | 极快(毫秒级) | 较慢(秒级) |
| 内存占用 | 低(几十 MB) | 高(几百 MB+) |
| 生态成熟度 | 新兴,快速增长 | 企业级,极其成熟 |
| 适用场景 | API 网关、微服务、ML 服务 | 大型企业应用、复杂事务 |
简单总结
- FastAPI + Uvicorn 在 I/O 密集型、高并发连接场景下与 Spring Boot 相当甚至更优;Spring Boot 在 CPU 密集型、复杂企业级业务中仍占传统优势。 选择取决于具体场景而非绝对性能。
Y 推荐文献
X 参考文献
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!

浙公网安备 33010602011771号