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

Что такое ASGI?

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

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

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

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

Что такое ASGI

ASGI (Asynchronous Server Gateway Interface) — стандарт для асинхронных веб-приложений в Python, эволюция WSGI.

WSGI vs ASGI

WSGI (синхронный)

def application(environ, start_response):
    status = '200 OK'
    response = [b'Hello World']
    start_response(status, [('Content-type', 'text/plain')])
    return response

# Один запрос → один процесс/поток
# Блокирует на I/O операциях

ASGI (асинхронный)

async def application(scope, receive, send):
    assert scope['type'] == '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 World',
    })

# Может обработать тысячи одновременных запросов
# Эффективен для I/O операций

Компоненты ASGI

scope — информация о соединении

scope = {
    'type': 'http',  # или 'websocket'
    'method': 'GET',
    'path': '/users/',
    'query_string': b'page=1',
    'headers': [(b'host', b'example.com')],
    'client': ('127.0.0.1', 8000),
}

receive — получить данные от клиента

message = await receive()
# {
#     'type': 'http.request',
#     'body': b'{"name": "John"}',
#     'more_body': False
# }

send — отправить данные клиенту

await send({
    'type': 'http.response.start',
    'status': 200,
    'headers': [(b'content-type', b'application/json')],
})

await send({
    'type': 'http.response.body',
    'body': b'{"id": 1}',
})

FastAPI (встроен ASGI)

from fastapi import FastAPI

app = FastAPI()

@app.get('/users/{user_id}')
async def get_user(user_id: int):
    # Асинхронно
    return {"id": user_id}

# Запуск
# uvicorn main:app --reload

Django Channels (ASGI для Django)

pip install channels
# settings.py
INSTALLED_APPS = [
    'daphne',  # ASGI сервер
    'channels',
    'django.contrib.auth',
    # ...
]

ASGI_APPLICATION = 'myproject.asgi.application'

# WebSocket поддержка
from channels.generic.websocket import AsyncWebsocketConsumer

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()
    
    async def receive(self, text_data):
        await self.send(text_data=text_data)

ASGI серверы

Uvicorn (популярный)

uvicorn main:app --host 0.0.0.0 --port 8000

Daphne (для Django)

daphne -b 0.0.0.0 -p 8000 myproject.asgi:application

Hypercorn

hypercorn main:app --bind 0.0.0.0:8000

WebSocket (ASGI преимущество)

# WSGI не поддерживает WebSocket

# ASGI с FastAPI
from fastapi import WebSocket

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

Производительность

         WSGI    ASGI
1 запрос  1ms     1ms
100 одновременных:
 WSGI   100ms (100 процессов)   # Тяжело
 ASGI   10ms  (1 процесс)       # Эффективно

ASGI middleware

from fastapi import FastAPI
from starlette.middleware.base import BaseHTTPMiddleware

class CustomMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request, call_next):
        response = await call_next(request)
        return response

app = FastAPI()
app.add_middleware(CustomMiddleware)

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

# ✓ ASGI
- WebSocket
- Real-time уведомления
- Server-Sent Events (SSE)
- I/O-bound операции
- Множество одновременных соединений

# ✓ WSGI
- Простые веб-приложения
- CPU-bound операции
- Legacy приложения
- Если нужна максимальная совместимость

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

Что такое ASGI? | PrepBro