← Назад к вопросам
Что такое 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 для лучшей производительности и функциональности.