Встречается на собеседованиях • сегодня

Можно ли совмещать потоки и асинхронность

Да, можно, но с осторожностью. В Python потоки (threading) и асинхронность (asyncio) работают на разных уровнях абстракции. Основные моменты:

  1. asyncio в потоке: Запуск asyncio цикла в отдельном потоке возможен через asyncio.run_coroutine_threadsafe() или loop.call_soon_threadsafe().

  2. Потоки в asyncio: Для вызова блокирующего кода из асинхронного контекста используйте loop.run_in_executor() с ThreadPoolExecutor.

Пример:

python
import asyncio
from concurrent.futures import ThreadPoolExecutor

async def async_task():
    print("Async task")

def blocking_task():
    print("Blocking task")

async def main():
    loop = asyncio.get_running_loop()
    # Запуск асинхронной задачи
    asyncio.create_task(async_task())
    # Запуск блокирующей задачи в потоке
    await loop.run_in_executor(ThreadPoolExecutor(), blocking_task)

asyncio.run(main())

Важно помнить:

  • Глобальная блокировка интерпретатора (GIL) ограничивает преимущества потоков для CPU-bound задач
  • Смешивание требует аккуратной синхронизации
  • Предпочтительнее использовать чистый asyncio для IO-bound задач
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы