← Назад к вопросам

В чем разница между WSGI и ASGI?

2.0 Middle🔥 151 комментариев
#FastAPI и Flask#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между WSGI и ASGI

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

WSGI (Web Server Gateway Interface)

WSGI — это синхронный стандарт, введённый в 2003 году (PEP 3333). Он определяет, как веб-серверы (Nginx, Apache) должны передавать HTTP-запросы Python-приложениям.

Характеристики:

  • Синхронная обработка — каждый запрос обрабатывается последовательно в отдельном потоке или процессе
  • Простота — стандартный, хорошо изученный протокол
  • Блокирующие операции — ввод-вывод (I/O) блокирует поток
# Пример WSGI приложения (например, Flask)
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    # Синхронная обработка
    return "Hello, World!"

if __name__ == "__main__":
    app.run()  # Запускается с WSGI сервером (gunicorn, uWSGI)

Серверы для WSGI:

  • Gunicorn (самый популярный)
  • uWSGI
  • Waitress
  • mod_wsgi для Apache

ASGI (Asynchronous Server Gateway Interface)

ASGI — это асинхронный стандарт, введённый в 2016 году. Он расширяет WSGI, добавляя поддержку асинхронного кода и других протоколов (WebSockets, HTTP/2).

Характеристики:

  • Асинхронная обработка — использует async/await для неблокирующих операций
  • Поддержка WebSockets — полнодуплексная коммуникация в реальном времени
  • Протоколы — HTTP, WebSocket, lifespan (запуск/завершение приложения)
  • Производительность — может обрабатывать тысячи одновременных соединений
# Пример ASGI приложения (например, FastAPI)
from fastapi import FastAPI
import asyncio

app = FastAPI()  # Автоматически ASGI

@app.get("/")
async def hello():
    # Асинхронная обработка
    await asyncio.sleep(1)  # Не блокирует другие запросы
    return {"message": "Hello, World!"}

@app.websocket("/ws")
async def websocket_endpoint(websocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await websocket.send_text(f"You said: {data}")

Серверы для ASGI:

  • Uvicorn (самый популярный)
  • Daphne
  • Hypercorn

Ключевые различия

ПараметрWSGIASGI
ПарадигмаСинхроннаяАсинхронная
I/O операцииБлокирующиеНеблокирующие
WebSocketsНе поддерживаетВстроенно поддерживает
Одновременные подключенияОграничены потокамиМожет быть 10000+
ФреймворкиFlask, DjangoFastAPI, Starlette
СложностьПростойТребует async/await
ПроизводительностьХорошая для стандартных случаевОтличная для I/O heavy приложений

Синхронизм vs асинхронизм: практический пример

# WSGI (синхронный Flask)
from flask import Flask
import time

app = Flask(__name__)

@app.route("/slow")
def slow_endpoint():
    time.sleep(2)  # Блокирует ВЕСЬ поток
    return "Done"

# Если 10 пользователей будут дёргать /slow одновременно,
# нужно 10 потоков/процессов, каждый ждёт 2 секунды
# ASGI (асинхронный FastAPI)
from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/slow")
async def slow_endpoint():
    await asyncio.sleep(2)  # НЕ блокирует поток
    return {"status": "Done"}

# 10000 пользователей могут ждать одновременно в одном потоке
# благодаря event loop (asyncio)

Когда использовать что

WSGI подходит для:

  • Традиционных веб-приложений (Django, Flask)
  • Когда не нужны WebSockets
  • Простых CRUD операций
  • Когда команда не имеет опыта с async/await

ASGI подходит для:

  • High-performance приложений (FastAPI)
  • Real-time функционала (чаты, уведомления)
  • I/O heavy приложений (много API запросов к другим сервисам)
  • Микросервисов с высокой нагрузкой

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