什么是ASGI?什么是WSGI?
ASGI是Python异步Web应用的新标准,相比传统WSGI支持异步I/O、WebSocket和高并发。WSGI适用于同步框架(如Flask),每个请求需独立线程处理;而ASGI(如FastAPI)通过事件循环单线程处理多请求,资源消耗更低。ASGI服务器如Uvicorn原生支持异步操作,显著提升I/O密集型任务性能,是现代Python Web开发的首选方案。
ASGI(Asynchronous Server Gateway Interface,异步服务器网关接口)是 Python Web 应用的一种异步通信标准,用于连接 Web 服务器和异步 Python Web 框架(如 FastAPI、Starlette、Quart 等)。要理解 ASGI,我们可以把它和传统的 WSGI(Web Server Gateway Interface) 服务器进行对比。
1. WSGI:传统同步服务器标准
什么是 WSGI?
- WSGI 是 Python 为同步 Web 应用定义的标准接口(PEP 3333)。
- 它规定了 Web 服务器(如 Apache、Nginx + uWSGI/Gunicorn)如何与 Python Web 框架(如 Flask、Django <3.0)通信。
- 每个请求由一个独立的线程或进程处理,处理完才响应下一个请求。
典型 WSGI 架构:
浏览器 → Nginx → Gunicorn/uWSGI(WSGI 服务器) → Flask/Django(同步应用)
WSGI 的局限:
- 不支持异步:无法高效处理 WebSocket、长轮询、Server-Sent Events(SSE)等。
- 高并发性能瓶颈:每个请求占用一个线程/进程,资源消耗大。
- 例如:Flask 本身是同步的,即使你用
async def,在 WSGI 下也无法真正异步执行。
常见 WSGI 服务器:
Gunicorn(同步 worker)、uWSGI、mod_wsgi
2. ASGI:现代异步服务器标准
什么是 ASGI?
- ASGI 是 WSGI 的异步扩展(由 Django 团队提出),支持异步 I/O、WebSocket、HTTP/2 等。
- 它允许一个应用同时处理多个请求(通过事件循环),而不需要为每个请求创建新线程。
- 一个进程可以处理成千上万个并发连接(适合 I/O 密集型任务,如 API、实时通信)。
典型 ASGI 架构:
浏览器 → Nginx → Uvicorn/Daphne(ASGI 服务器) → FastAPI/Starlette/Django 3.0+(异步应用)
ASGI 的优势:
|
异步支持 |
可使用 |
|
WebSocket 原生支持 |
无需额外协议或库 |
|
高并发低资源 |
单进程可处理大量连接(基于 asyncio) |
|
向后兼容 WSGI |
ASGI 服务器通常也能运行同步应用(通过线程池) |
常见 ASGI 服务器:
Uvicorn(最快,基于 uvloop)、Daphne(Django 官方)、Hypercorn
对比总结:ASGI vs WSGI
|
同步/异步 |
仅同步 |
支持异步 + 兼容同步 |
|
WebSocket |
不支持 |
原生支持 |
|
并发模型 |
多线程/多进程 |
单线程事件循环(asyncio) |
|
适用框架 |
Flask, Django (<3.0) |
FastAPI, Starlette, Django (≥3.0), Quart |
|
典型服务器 |
Gunicorn (sync), uWSGI |
Uvicorn, Daphne, Hypercorn |
|
性能(I/O 密集) |
较低(线程开销大) |
更高(轻量级协程) |
|
学习曲线 |
简单 |
需理解 async/await |
举个实际例子
场景:一个 API 需要调用外部服务(如天气 API)
WSGI(Flask)方式:
# 每个请求阻塞等待外部 API 响应
@app.route("/weather")
def get_weather():
response = requests.get("https://api.weather.com/...") # 阻塞!
return response.json()
→ 100 个并发请求 = 100 个线程,资源消耗大。
ASGI(FastAPI)方式:
python
import httpx
@app.get("/weather")
async def get_weather():
async with httpx.AsyncClient() as client:
response = await client.get("https://api.weather.com/...") # 非阻塞!
return response.json()
→ 100 个并发请求 = 1 个事件循环,高效利用 CPU。
总结
- WSGI 是 Python 同步 Web 应用的“老标准”,简单但无法处理现代异步需求。
- ASGI 是 异步 Web 应用的“新标准”,支持 WebSocket、高并发、async/await,是 FastAPI 等现代框架的基础。
- Uvicorn 是目前最流行的 ASGI 服务器(快、轻量、兼容性好)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)