Выбор ответа Senior FastAPI и Pydantic обновлено

Пул потоков для sync-обработчиков

Вопрос

В FastAPI все обработчики объявлены через обычный def и ходят в медленный внешний API. При 100 одновременных запросах часть ждёт, хотя CPU свободен. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Синхронные обработчики идут в пуле потоков anyio (по умолчанию 40), остальные ждут. Starlette выполняет синхронные функции через anyio.tothread.runsync, а у лимитера anyio по умолчанию 40 токенов на процесс.

Варианты ответа

  1. FastAPI обрабатывает def-обработчики строго последовательно в одном потоке
  2. Синхронные обработчики идут в пуле потоков anyio (по умолчанию 40), остальные ждутправильный ответ
  3. uvicorn по умолчанию ограничивает число соединений на воркер десятью
  4. GIL не даёт выполнять больше одного запроса одновременно в процессе Python

Разбор

Starlette выполняет синхронные функции через anyio.to_thread.run_sync, а у лимитера anyio по умолчанию 40 токенов на процесс. Когда все 40 потоков ждут внешний API, остальные запросы стоят в очереди. Варианты: перейти на async def с асинхронным клиентом, увеличить лимит потоков осознанно, добавить процессов. Последовательной обработки нет, а GIL отпускается при ожидании сети.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.