Что произойдёт, если синхронный блокирующий код попадёт в asyncio, и как вынести такую задачу в отдельный поток?

Блокирующий синхронный код остановит event loop на время выполнения и задержит остальные корутины. Для блокирующего I/O его можно перенести в поток через asyncio.to_thread.

Короткий ответ

Что ответить на собеседовании

Блокирующий синхронный код остановит event loop на время выполнения и задержит остальные корутины. Для блокирующего I/O его можно перенести в поток через asyncio.to_thread.

Подробный разбор

Ответ с пояснениями

Условие

Что произойдёт, если синхронный блокирующий код попадёт в asyncio, и как вынести такую задачу в отдельный поток?

Ответ

Блокирующий синхронный код остановит event loop на время выполнения и задержит остальные корутины. Для блокирующего I/O его можно перенести в поток через asyncio.to_thread.

result = await asyncio.to_thread(blocking_function, argument)

Функция продолжит работать синхронно, но в другом потоке. Для CPU-нагрузки на обычной GIL-сборке часто нужен процессный пул; некоторые расширения освобождают GIL. Отмена ожидающей корутины не гарантирует остановку уже работающей функции в потоке, поэтому нужны собственные тайм-ауты и ограничение параллелизма.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее