Как обработать блокирующую функцию из старой библиотеки так, чтобы не блокировать event loop?

Вынесите блокирующий I/O-вызов в asyncio.to_thread или подходящий executor. Если работа преимущественно CPU-bound и не освобождает GIL, рассмотрите отдельный процесс.

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

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

Вынесите блокирующий I/O-вызов в asyncio.to_thread или подходящий executor. Если работа преимущественно CPU-bound и не освобождает GIL, рассмотрите отдельный процесс.

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

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

Вынесите блокирующий I/O-вызов в asyncio.to_thread или подходящий executor. Если работа преимущественно CPU-bound и не освобождает GIL, рассмотрите отдельный процесс.

result = await asyncio.to_thread(legacy_function, argument)

Проверьте потокобезопасность библиотеки и ограничьте число одновременных вызовов. Отмена coroutine не останавливает принудительно уже работающий поток; таймауты нужны и самой операции. Для API с thread-local состоянием может потребоваться выделенный executor или другая изоляция.

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

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

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

Подробнее