Знаете ли вы о WSGI и ASGI и когда они нужны для

Знаете ли вы о WSGI и ASGI и когда они нужны для масштабируемых веб-приложений?
В экосистеме Python существуют два основных интерфейса для веб-серверов: WSGI (Web Server Gateway Interface) и ASGI (Asynchronous Server Gateway Interface).
Простой WSGI-сервер (синхронный)
def wsgi_app(environ, start_response):
"""Простое WSGI-приложение"""
status = '200 OK'
headers = [('Content-Type', 'text/plain')]
start_response(status, headers)
# Это блокирующая операция!
import time
time.sleep(0.1) # Имитация блокирующей задачи (БД, файловая система)
return [b"Hello, WSGI World!"]
Запуск WSGI-сервера
from wsgiref.simple_server import make_server
httpd = make_server('', 8000, wsgi_app)
httpd.serve_forever()
Простой ASGI-сервер (асинхронный)
async def asgi_app(scope, receive, send):
"""Простое ASGI-приложение"""
assert scope['type'] == 'http'
# Асинхронная операция не блокирует сервер
import asyncio
await asyncio.sleep(0.1) # Имитация асинхронной задачи (БД, HTTP)
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 World!",
})
Запуск ASGI-сервера с uvicorn
pip install uvicorn
uvicorn asgi_example:asgi_app
WSGI:
-
Синхронный (блокирующий) интерфейс
-
Только для HTTP
-
Проще в настройке и отладке
-
Используется в Flask, Django (до версии 3.0), WSGI-серверами (Gunicorn, uWSGI)
-
Хорошо подходит для традиционных веб-приложений
ASGI:
-
Асинхронный (неблокирующий) интерфейс
-
Поддерживает HTTP, WebSockets, HTTP/2
-
Подходит для реактивных приложений и длительных соединений
-
Используется в FastAPI, Starlette, Django 3.0+, ASGI-серверами (Uvicorn, Daphne)
-
Лучше масштабируется при большом количестве одновременных соединений