Короткий ответ
WSGI поддерживает только синхронную модель «один запрос — один вызов приложения», а ASGI поддерживает async/await, WebSocket и долгоживущие соединения, что необходимо для приложений на FastAPI, Starlette или Django Channels.
Как это работает подробнее
WSGI-приложение — синхронная функция, вызываемая один раз на запрос; ASGI-приложение — корутина с интерфейсом scope, receive, send, способная обрабатывать несколько сообщений за «соединение» без блокировки потока.
Пример кода
example.py
# WSGI
def application(environ, start_response):
start_response("200 OK", [("Content-Type", "text/plain")])
return [b"Hello"]
# ASGI
async def app(scope, receive, send):
await send({"type": "http.response.start", "status": 200,
"headers": [(b"content-type", b"text/plain")]})
await send({"type": "http.response.body", "body": b"Hello"})Что использовать на практике
- Рекомендация. ASGI нужен для WebSocket, Server-Sent Events или когда хочется обслуживать много I/O-bound соединений одним процессом. Для обычного CRUD-приложения выигрыш зависит от того, насколько код реально асинхронный.
Подводные камни
- Риск. считать ASGI «быстрее WSGI» по умолчанию без учёта профиля нагрузки; пытаться запустить WSGI-приложение через ASGI-сервер без адаптера.