Комментарий пользователя
Здравствуйте! Планируем в команде заменить Flask на FastAPI для новых сервисов. Какие есть подводные камни и как выстроить async-обработку?
Ответ специалиста
Добрый день, Марат! FastAPI работет быстро благодаря ассинхроности, но нужно понимать: не весь код должен быть async.
Если у вас тяжелые CPU-операции или старые библиотеки без ассинхронного режима, то вынесите их в фоновые процессы или используйте отдельные потоки.
Для HTTP-серверов запускайте FastAPI под Uvicorn/Gunicorn. Если говорить чуть подробнее, то:
- Uvicorn — это скоростной «двигатель», который понимает современный асинхронный код.
- Gunicorn — это менеджер проекта, который запускает несколько копий вашего приложения (воркеров).
Такая связка нужна, чтобы, даже если один воркер занят тяжелой задачей или заглючил, остальные продолжали отвечать пользователям, и сайт не падал. Используйте:
uvicorn.workers.UvicornWorker или gunicorn -k uvicorn.workers.UvicornWorker.
Простой пример endpoint:
from fastapi import FastAPI
import httpx
app = FastAPI()
@app.get("/proxy")
async def proxy(q: str):
async with httpx.AsyncClient(timeout=5.0) as client:
r = await client.get("https://api.example.com/search", params={"q": q})
r.raise_for_status()
return r.json()
Не используйте в асинхронных функциях код, — который заставляет программу ждать. Если ваша база данных не поддерживает асинхронность, запускайте ее через asyncio.to_thread/run_in_executor или переходите на асинхронные драйверы типа asyncpg. Для стабильной работы настройте connection pool (готовый набор соединений с базой), установите лимиты по времени и количеству запросов, а также включите сжатие данных.
В плане безопасности всегда проверяйте входящие данные через Pydantic, ограничьте размер запросов и частоту обращений, чтобы сервер не перегрузили. Настройте правила доступа CORS и думаю HTTPS даже говорить не нужно. В конце протестируйте сервер под нагрузкой, чтобы правильно рассчитать количество рабочих воркеров под мощность вашего процессора.
Присоединяйтесь к нашему сообществу и развивайтесь вместе с нами.