Вопрос проверяет понимание того, как блокирующий код влияет на асинхронные приложения.
Если в event loop выполнить блокирующую CPU-bound операцию, весь цикл событий остановится до её завершения. В это время другие корутины не будут выполняться, а запросы не будут обрабатываться. Это приводит к задержкам и падению производительности. Поэтому CPU-bound задачи выносят в отдельные процессы или executors.
Event loop работает в одном потоке и переключает задачи только тогда, когда они добровольно уступают управление через await.
Если внутри корутины выполнить:
тяжёлый расчёт
синхронный вызов
долгий цикл
то:
управление не возвращается loop
другие задачи не выполняются
сервер перестаёт отвечать
Пример проблемы:
async def handler():
heavy_calculation() # блокирует loop
return "done"
Используют:
ProcessPoolExecutor
multiprocessing
внешние сервисы обработки
Пример:
loop.run_in_executor(None, heavy_calculation)
Особенно заметно:
в FastAPI
в aiohttp
в websocket-серверах
Даже одна блокирующая операция может остановить обработку сотен соединений.
CPU-bound операции внутри event loop блокируют весь цикл и останавливают выполнение корутин. Их необходимо выносить за пределы event loop.