Блокирующий синхронный код остановит event loop на время выполнения и задержит остальные корутины. Для блокирующего I/O его можно перенести в поток через asyncio.to_thread.
Что произойдёт, если синхронный блокирующий код попадёт в asyncio, и как вынести такую задачу в отдельный поток?
Блокирующий синхронный код остановит 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. Отмена ожидающей корутины не гарантирует остановку уже работающей функции в потоке, поэтому нужны собственные тайм-ауты и ограничение параллелизма.