wsgi是同步协议,要求请求在单线程/进程内阻塞完成,适合传统web应用;asgi是异步协议,基于事件流支持websocket、http/2等,适合高并发i/o密集场景。

WSGI 是同步协议,适合传统 Web 应用
WSGI(Web Server Gateway Interface)是 Python 的经典 Web 服务器接口标准,定义了 Web 服务器与 Python 应用之间的同步调用方式。它要求每个请求必须在一个线程或进程内完成处理,从接收请求、执行业务逻辑到返回响应,全程阻塞等待。比如 Flask、Django(默认配置下)都基于 WSGI 运行。
常见部署组合如 uWSGI + Nginx 或 Gunicorn + Nginx,底层依赖多进程/多线程模型应对并发。这意味着:
- 一个请求卡住(如等待数据库响应、HTTP 调用),整个工作单元无法处理其他请求
- 高并发长连接(如 WebSocket、SSE)难以原生支持
- 不支持 async/await 语法,异步代码需额外封装或降级为线程池
ASGI 是异步协议,专为现代 I/O 密集场景设计
ASGI(Asynchronous Server Gateway Interface)是 WSGI 的演进版本,核心目标是统一同步与异步 Web 应用的接口规范。它将请求生命周期拆分为多个事件(如 connect、receive、send、disconnect),允许应用在等待 I/O 时让出控制权,从而用单线程高效处理成千上万并发连接。
Django(3.1+)、FastAPI、Starlette、Quart 等框架原生支持 ASGI。典型部署如 Uvicorn 或 Daphne(配合 Nginx 反向代理)。关键特性包括:
立即学习“Python免费学习笔记(深入)”;
- 原生支持 WebSocket、HTTP/2、Server-Sent Events
- 可混用 async def 和普通 def 视图,兼容同步逻辑
- 中间件、路由、生命周期钩子均为异步就绪
- 能直接对接 asyncio 生态(如 aiohttp 客户端、asyncpg 数据库驱动)
协议结构差异:从“一次调用”到“事件流”
WSGI 应用是一个可调用对象:application(environ, start_response),服务器传入环境字典和响应启动函数,应用一次性返回响应体迭代器。
ASGI 应用是一个可调用对象,返回一个 awaitable:application(scope, receive, send)。其中:
- scope 类似 WSGI 的 environ,描述请求上下文(含 type: 'http' / 'websocket')
- receive 是异步函数,用于按需拉取请求数据(如消息帧、body 分块)
- send 是异步函数,用于主动推送响应(如 status、headers、body、close、accept 等事件)
这种设计使 ASGI 天然适配双向、长周期通信,而 WSGI 只能靠轮询或升级为独立服务模拟类似行为。
选型建议:看场景,不盲目追新
不需要实时交互、QPS 中等(
需要 WebSocket 支持、大量 HTTP 流式响应、高并发低延迟(如 API 网关、实时仪表盘)、或已使用 async 生态——优先选 ASGI,并搭配 Uvicorn 等异步服务器。
注意:Django 等框架可通过 asgiref 兼容双模式,但启用 ASGI 后需确保所有中间件、后端(缓存、DB)也支持异步,否则可能隐式阻塞事件循环。










