Что такое ASGI и чем он отличается от WSGI

Ответ

ASGI (Asynchronous Server Gateway Interface) — это стандарт (спецификация) для взаимодействия между асинхронными Python веб-фреймворками и веб-серверами. Он является духовным наследником WSGI и расширяет его возможности для поддержки современных веб-протоколов.

Ключевое отличие от WSGI:

  • WSGI (Web Server Gateway Interface)синхронный стандарт. Он рассчитан на классический цикл "один запрос — один ответ". Он не может обрабатывать долгоживущие соединения, такие как WebSockets.
  • ASGIасинхронный стандарт. Он позволяет приложению работать в цикле событий (event loop) и обрабатывать множество соединений и событий одновременно. Это делает его идеальным для WebSocket, HTTP/2, long-polling и других протоколов, требующих постоянного соединения.

Основные возможности ASGI:

  • Поддержка async/await.
  • Обработка нескольких входящих и исходящих событий для одного приложения.
  • Нативная поддержка долгоживущих соединений.

Пример использования в экосистеме:

Современный асинхронный стек на Python выглядит так:

  1. ASGI-сервер: Uvicorn, Hypercorn, Daphne.
  2. ASGI-фреймворк: FastAPI, Starlette, Django (начиная с версии 3.0).
# Пример минимального приложения на FastAPI (ASGI-фреймворк)
from fastapi import FastAPI

# app - это ASGI-совместимое приложение
app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello, ASGI World!"}

# Запуск через ASGI-сервер:
# uvicorn main:app --reload

Ответ 18+ 🔞

Давай разберём, что это за зверь такой — ASGI. Представь, что у тебя есть старый добрый WSGI — это как почтальон Печкин, который приносит одну телеграмму, ждёт, пока ты её прочитаешь и напишешь ответ, и только потом несёт следующую. Работает, но если писем дохуя, он будет копить их в мешке и тупить.

А тут появляется ASGI — это уже не почтальон, а какой-то ёбаный супергерой-мультитаскер. Он может одновременно и письма разносить, и по телефону болтать, и в телеграме сидеть, и ещё умудряется кофе себе заваривать. Всё потому, что он асинхронный, блядь.

Короче, главная разница:

  • WSGI — синхронный, для простых запросов-ответов. WebSocket'ы для него — это как просить Печкина доставить живого попугая: он обосрётся и сдохнет.
  • ASGI — асинхронный, создан для всего современного говна: WebSocket'ы, HTTP/2, long-polling. Он просто берёт и обрабатывает всё это в одном потоке событий, не создавая отдельный поток на каждого юзера. Эффективность, блядь, зашкаливает.

Что он умеет, этот красавчик:

  • Работать с async/await — то есть не блокировать всё приложение, пока одна операция ждёт ответа от базы данных.
  • Держать кучу соединений открытыми одновременно. Чат, стриминг, уведомления — всё это его родная стихия.
  • Принимать и отправлять события в любой момент, а не только в ответ на запрос.

Как это выглядит на практике:

Собираешь себе стек, и жизнь налаживается:

  1. ASGI-сервер (тот, кто всё крутит): Uvicorn, Hypercorn. Быстрые, асинхронные, злые.
  2. ASGI-фреймворк (где пишешь логику): FastAPI, Starlette. Ну или Django, который с третьей версии тоже притворяется асинхронным, хитрая жопа.

Вот, смотри, как просто это выглядит в коде:

# Берём FastAPI — он по умолчанию ASGI-совместимый
from fastapi import FastAPI

# Создаём приложение — это и есть наш ASGI-объект
app = FastAPI()

# Объявляем асинхронный эндпоинт
@app.get("/")
async def read_root():
    return {"message": "Ну привет, асинхронный мир, ёпта!"}

# Запускаем через ASGI-сервер, например Uvicorn:
# uvicorn main:app --reload

И всё, блядь! Сервер Uvicorn (ASGI-совместимый) берёт наше приложение app (тоже ASGI-совместимое) и начинает его крутить, обрабатывая тысячи соединений без лишних телодвижений. Красота, в рот меня чих-пых! Раньше для такого нужно было городить огород из отдельных процессов и потоков, а теперь — пожалуйста, async/await и летишь.