[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 是应用服务器,负责:

  1. 接收客户端连接(HTTP/WebSocket)
  2. 解析协议并封装为 ASGI 标准消息格式
  3. 调用你的 ASGI 应用(如 FastAPI 实例)
  4. 返回响应给客户端
  • 它类似于 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?

  1. Python 的 async/await:充分利用异步 I/O,单线程处理数千并发连接
  2. WebSocket 支持:实时通信(聊天、推送、游戏)的基础设施
  3. 现代协议:HTTP/2 多路复用、Server Push 等
  4. 微服务架构:高性能网关,适合容器化部署(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 + FastAPISpring 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 参考文献

posted @ 2026-03-27 10:56  千千寰宇  阅读(18)  评论(0)    收藏  举报