
WSGI 和 ASGI 它们定义了 Web 服务器(如 Nginx、Apache)与 Python Web 应用(如 Django、Flask、FastAPI)之间如何通信。
简单来说:WSGI 是同步时代的标准,ASGI 是异步时代的升级版。
一、WSGI
WSGI(Web Server Gateway Interface,Web 服务器网关接口)是 Python 在 2003 年提出的标准,目的是解决不同 Web 框架与服务器之间的兼容性问题。
在 WSGI 出现之前,每个 Web 框架(如 Django、Flask)都需要针对不同的服务器(如 Apache、Nginx)编写适配代码。WSGI 统一了接口,让任何 WSGI 服务器都可以运行任何 WSGI 应用。
WSGI 是同步、阻塞的模型。

问题:
-
每个请求占用一个线程/进程
-
处理 I/O 时(如数据库查询、API 调用),线程被阻塞,无法处理其他请求
-
并发能力受限于线程/进程数量
WSGI 的局限性
| 问题 | 说明 |
|---|---|
| 同步阻塞 | I/O 操作会阻塞线程,浪费资源 |
| 不支持 WebSocket | 无法处理长连接和双向通信 |
| 并发能力有限 | 依赖多线程/多进程,资源消耗大 |
| 高并发下性能差 | 大量请求时,线程切换开销大 |
二、ASGI
ASGI(Asynchronous Server Gateway Interface,异步服务器网关接口)是 2017 年 提出的新标准,是 WSGI 的异步升级版。
支持:
-
异步 I/O:在等待 I/O 时可以切换处理其他请求
-
WebSocket:支持长连接和双向通信
-
HTTP/2:支持多路复用
-
更好的并发性能
ASGI 是异步、非阻塞的模型。

优势:
-
单个工作进程可以同时处理多个请求
-
I/O 等待期间不会阻塞其他请求
-
高并发场景下资源利用率更高
ASGI 支持多种应用层协议:

三、WSGI vs ASGI 对比
| 对比维度 | WSGI | ASGI |
|---|---|---|
| 推出时间 | 2003 年 | 2017 年 |
| 编程模型 | 同步(同步阻塞) | 异步(异步非阻塞) |
| I/O 处理 | 阻塞(等待时不能处理其他请求) | 非阻塞(等待时切换处理其他请求) |
| WebSocket | 不支持 | 原生支持 |
| HTTP/2 | 不支持 | 支持 |
| 并发模式 | 多线程 / 多进程 | 事件循环(单线程异步) |
| 典型服务器 | Gunicorn、uWSGI、mod_wsgi | Uvicorn、Hypercorn、Daphne |
| 典型框架 | Flask、Django(同步模式) | FastAPI、Starlette、Django(异步模式) |
| 性能 | 一般 | 高(在高 I/O 场景下优势明显) |
四、对比示例
WSGI 应用(Flask)
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
time.sleep(1) # 模拟耗时操作(阻塞整个线程)
return "Hello, WSGI!"
当 100 个请求同时到达时,100 个线程被阻塞,等待 1 秒后逐个返回。
ASGI 应用(FastAPI)
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/")
async def hello():
await asyncio.sleep(1) # 异步等待,不阻塞其他请求
return "Hello, ASGI!"
当 100 个请求同时到达时,单线程 就可以处理所有请求,每个请求在 sleep 时让出控制权,处理下一个请求,全部请求在约 1 秒内完成。
五、服务器实现
| 服务器 | 支持 WSGI | 支持 ASGI | 说明 |
|---|---|---|---|
| Gunicorn | ✅ | ❌ | 最流行的 WSGI 服务器 |
| uWSGI | ✅ | ❌ | 功能丰富的 WSGI 服务器 |
| Uvicorn | ❌ | ✅ | 最流行的 ASGI 服务器(基于 uvloop) |
| Hypercorn | ❌ | ✅ | 支持 HTTP/2 和 HTTP/3 |
| Daphne | ❌ | ✅ | Django Channels 官方服务器 |
| ASGI to WSGI | ✅ | ✅ | 可以在 ASGI 服务器中运行 WSGI 应用 |
六、选择
| 场景 | 推荐方案 |
|---|---|
| 传统 Web 应用、管理后台 | WSGI(Flask、Django) |
| 高并发 API | ASGI(FastAPI) |
| 需要 WebSocket(聊天、实时通知) | ASGI(FastAPI、Django Channels) |
| I/O 密集型业务(大量数据库查询、API 调用) | ASGI(FastAPI) |
| CPU 密集型业务(计算为主) | WSGI 或 ASGI 区别不大,建议多进程部署 |