Блокирующий вызов удерживает поток event loop до завершения операции и не отдаёт управление другим coroutine. Поэтому один синхронный HTTP-запрос, sleep или тяжёлый расчёт задерживает множество задач.
Что такое блокирующий вызов в асинхронном коде и почему это проблема?
Блокирующий вызов удерживает поток event loop до завершения операции и не отдаёт управление другим coroutine. Поэтому один синхронный HTTP-запрос, sleep или тяжёлый расчёт задерживает множество задач.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Блокирующий вызов удерживает поток event loop до завершения операции и не отдаёт управление другим coroutine. Поэтому один синхронный HTTP-запрос, sleep или тяжёлый расчёт задерживает множество задач.
async def не превращает содержимое в неблокирующее. Для ожидания используйте асинхронную библиотеку и await; синхронный I/O можно вынести в ограниченный thread pool. CPU-bound Python-код обычно отправляют в процесс или отдельный сервис. Важно ограничить параллелизм и задать timeout: тысячи задач, ожидающих забитый пул, тоже создают перегрузку. Диагностировать проблему помогает event-loop lag и профиль работающего процесса.