> Как обойти блокировку при вызове синхронной функции в асинхронном коде в Python? (Python)

Уровень: senior · Роль: backend · Язык: Python · Категория: Технические вопросы

Компании: HeadHunter

Стек: Python

> Пример ответа

В асинхронном коде Python вызов синхронной блокирующей функции (например, time.sleep(), requests.get()) останавливает весь event loop, пока она выполняется. Основные способы обойти это:

  1. Использовать asyncio.to_thread() (Python 3.9+): запускает синхронную функцию в отдельном потоке, не блокируя event loop.

    PYTHON
    import asyncio
    import time
    async def main():
    result = await asyncio.to_thread(time.sleep, 2)
    print("Готово")
  2. Использовать loop.run_in_executor(): более гибкий вариант, позволяет задать пул потоков или процессов.

    PYTHON
    import asyncio
    from concurrent.futures import ThreadPoolExecutor
    async def main():
    with ThreadPoolExecutor() as executor:
    result = await asyncio.get_event_loop().run_in_executor(executor, time.sleep, 2)
  3. Для CPU-интенсивных задач - использовать ProcessPoolExecutor через run_in_executor, чтобы избежать GIL.

  4. Альтернатива для I/O-bound задач - заменить синхронную библиотеку на асинхронную (например, aiohttp вместо requests, asyncio.sleep вместо time.sleep).

Выбор зависит от контекста: to_thread() - самый простой для быстрых блокировок, run_in_executor - для тонкой настройки, а замена библиотек - наиболее эффективный подход.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью