Выбор ответа Middle HTTP, WSGI и ASGI спрашивают часто обновлено

Блокирующий вызов в uvicorn

Вопрос

Сервис на FastAPI под uvicorn с одним воркером. В async def обработчике вызывается requests.get на 3 секунды. Что происходит с другими запросами в эти 3 секунды?

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

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

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

Коротко

Правильный ответ: Не обрабатываются: блокирующий вызов останавливает цикл событий процесса. Один воркер uvicorn это один цикл событий.

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

  1. Не обрабатываются: блокирующий вызов останавливает цикл событий процессаправильный ответ
  2. Обрабатываются в других потоках uvicorn
  3. Обрабатываются, потому что uvicorn автоматически запускает новый процесс
  4. Получают ответ из кеша

Разбор

Один воркер uvicorn это один цикл событий. Синхронный requests.get не отдаёт управление, и весь процесс стоит. Решения: асинхронный клиент (httpx.AsyncClient), обычный def-обработчик (FastAPI выполнит его в пуле потоков) или await asyncio.to_thread(...). Новых процессов uvicorn на лету не создаёт.

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

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