Ответ
WSGI (Web Server Gateway Interface) и ASGI (Asynchronous Server Gateway Interface) — это спецификации, которые определяют, как веб-сервер взаимодействует с Python-приложениями.
WSGI (PEP 3333)
- Тип: Синхронный.
- Модель работы: Обрабатывает каждый запрос в отдельном потоке или процессе. Модель «один запрос — один вызов».
- Ограничения: Неэффективен для операций, требующих долгого ожидания (I/O), и не поддерживает долгоживущие соединения, такие как WebSockets.
- Примеры фреймворков: Django, Flask, Pyramid.
# WSGI-приложение — простая вызываемая функция
def application(environ, start_response):
# environ - словарь с данными запроса
# start_response - функция для отправки заголовков
status = '200 OK'
headers = [('Content-type', 'text/plain; charset=utf-8')]
start_response(status, headers)
return [b'Hello, WSGI!']
ASGI
- Тип: Асинхронный.
- Модель работы: Построен на
async/await
, что позволяет обрабатывать множество соединений и I/O-операций одновременно в одном потоке. - Возможности: Является надмножеством WSGI. Нативно поддерживает WebSockets, long-polling, HTTP/2 и другие асинхронные протоколы.
- Примеры фреймворков: FastAPI, Starlette, Quart.
# ASGI-приложение — асинхронная функция
async def application(scope, receive, send):
# 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!',
})
Итог: WSGI — это стандарт для классических синхронных веб-приложений. ASGI — его современный асинхронный преемник, созданный для высокопроизводительных приложений, требующих обработки множества одновременных подключений.