Выбор ответа Middle HTTP, WSGI и ASGI спрашивают часто обновлено
Блокирующий вызов в uvicorn
Вопрос
Сервис на FastAPI под uvicorn с одним воркером. В async def обработчике вызывается requests.get на 3 секунды. Что происходит с другими запросами в эти 3 секунды?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Не обрабатываются: блокирующий вызов останавливает цикл событий процесса. Один воркер uvicorn это один цикл событий.
Варианты ответа
- Не обрабатываются: блокирующий вызов останавливает цикл событий процессаправильный ответ
- Обрабатываются в других потоках uvicorn
- Обрабатываются, потому что uvicorn автоматически запускает новый процесс
- Получают ответ из кеша
Разбор
Один воркер uvicorn это один цикл событий. Синхронный requests.get не отдаёт управление, и весь процесс стоит. Решения: асинхронный клиент (httpx.AsyncClient), обычный def-обработчик (FastAPI выполнит его в пуле потоков) или await asyncio.to_thread(...). Новых процессов uvicorn на лету не создаёт.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.