Чем отличаются интерфейсы WSGI и ASGI в Python

Ответ

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 — его современный асинхронный преемник, созданный для высокопроизводительных приложений, требующих обработки множества одновременных подключений.