Выбор ответа Senior FastAPI и Pydantic обновлено
Пул потоков для sync-обработчиков
Вопрос
В FastAPI все обработчики объявлены через обычный def и ходят в медленный внешний API. При 100 одновременных запросах часть ждёт, хотя CPU свободен. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Синхронные обработчики идут в пуле потоков anyio (по умолчанию 40), остальные ждут. Starlette выполняет синхронные функции через anyio.tothread.runsync, а у лимитера anyio по умолчанию 40 токенов на процесс.
Варианты ответа
- FastAPI обрабатывает
def-обработчики строго последовательно в одном потоке - Синхронные обработчики идут в пуле потоков anyio (по умолчанию 40), остальные ждутправильный ответ
- uvicorn по умолчанию ограничивает число соединений на воркер десятью
- GIL не даёт выполнять больше одного запроса одновременно в процессе Python
Разбор
Starlette выполняет синхронные функции через anyio.to_thread.run_sync, а у лимитера anyio по умолчанию 40 токенов на процесс. Когда все 40 потоков ждут внешний API, остальные запросы стоят в очереди. Варианты: перейти на async def с асинхронным клиентом, увеличить лимит потоков осознанно, добавить процессов. Последовательной обработки нет, а GIL отпускается при ожидании сети.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «FastAPI и Pydantic»
- Откуда в FastAPI ответ 422
- Annotated в параметрах FastAPI
- BackgroundTasks или очередь задач
- httpx.AsyncClient на каждый запрос
- Разбор и проверка query-параметров
- Граф зависимостей с кешем на запрос
- Подмена зависимостей в тестах
- Сколько раз вызывается зависимость