Ответ вслух Senior FastAPI и Pydantic обновлено

Подводные камни async в FastAPI

Вопрос

Какие ошибки вы видели в асинхронных сервисах на FastAPI и как их избегать?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Образцовый ответ: «Самая частая ошибка: синхронный вызов в async def, например requests.get или синхронный драйвер БД. Один такой вызов останавливает весь процесс, и задержка растёт у всех запросов сразу.

Что должно прозвучать в ответе

  • Блокирующие вызовы в async def: requests, time.sleep, sync-драйвер БД

  • Тяжёлые вычисления в цикле событий

  • Клиенты и пулы на каждый запрос вместо lifespan

  • Сессия БД вне зависимости с yield, утечка соединений

  • Fire-and-forget задачи без ссылок и обработки ошибок

  • Наблюдаемость: таймауты, метрики задержки цикла

Что могут спросить следом

  • Как обнаружить блокировку цикла событий в проде?
  • Как ограничить параллелизм запросов к внешнему API?

Разбор

Образцовый ответ: «Самая частая ошибка: синхронный вызов в async def, например requests.get или синхронный драйвер БД. Один такой вызов останавливает весь процесс, и задержка растёт у всех запросов сразу. Правило: в async def только асинхронные клиенты, а если библиотека синхронная, либо обычный def, либо asyncio.to_thread. Тяжёлые вычисления тоже блокируют цикл, их выношу в процессы или очередь. Вторая группа: ресурсы. httpx.AsyncClient и пул БД создаю один раз в lifespan, а сессию на запрос отдаю зависимостью с yield, иначе течёт пул соединений. Третья: фоновые задачи через create_task без ссылок и без обработки исключений, они теряются; важное отправляю в очередь. Ещё обязательно таймауты на все внешние вызовы и семафор, чтобы не открыть тысячу соединений к одному API. Блокировки цикла в проде ловлю метриками задержки цикла событий, py-spy и debug-режимом asyncio на стенде».

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

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