Web 服务器网关协议:ASGI 和 WSGI

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 区别不大,建议多进程部署
相关推荐
鬼手点金6 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
VidDown6 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
贵州诚鑫致达科技有限公司6 小时前
Linux的yum源怎么重启?源不是服务
linux·运维·服务器
小马不起床7 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
遇印记7 小时前
传输层,网络层
运维·服务器·网络·windows·学习
死磕音视频7 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
Elastic 中国社区官方博客8 小时前
一条 ES|QL 查询,涵盖365天的审计日志:在热数据和可搜索快照上执行相同的搜索
大数据·运维·服务器·elasticsearch·搜索引擎·全文检索
凤山老林8 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
北京中科新远科技9 小时前
高速光模块上线验收实战:DOM、FEC、BER与端口计数器怎么一起看
服务器·网络·php
澜山奕秋9 小时前
RHCSA
linux·运维·服务器