> Какова иерархия процессов, потоков и asyncio в Python? (Python)

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

Компании: HeadHunter

Стек: Python

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

В Python существует три уровня параллелизма, упорядоченных по возрастанию лёгкости и убыванию изоляции:

  1. Процессы (multiprocessing) - самые тяжёлые. Каждый процесс имеет собственное адресное пространство, GIL не мешает, но межпроцессное взаимодействие (IPC) требует сериализации (pickle) и медленнее. Используются для CPU-bound задач, когда нужно задействовать все ядра.

  2. Потоки (threading) - легче процессов, разделяют память внутри одного процесса. Из-за GIL в CPython потоки не выполняют Python-код параллельно (только конкурентно), но могут освобождать GIL при блокирующих операциях ввода-вывода (например, чтение из сети). Подходят для I/O-bound задач с синхронными блокировками (например, работа с файлами или сетевыми запросами через requests).

  3. Asyncio - кооперативная многозадачность на основе корутин и event loop. Один поток, один процесс, но переключение между корутинами происходит только в точках await (неблокирующее ожидание). Максимально лёгкий - тысячи корутин работают без накладных расходов на переключение контекста ОС. Идеален для высоконагруженных I/O-bound приложений (веб-серверы, API-клиенты), где все операции асинхронны.

Иерархия выбора (от простого к сложному):

  • Если задача CPU-bound → multiprocessing (или concurrent.futures.ProcessPoolExecutor).
  • Если I/O-bound и уже есть синхронный код → threading (или ThreadPoolExecutor).
  • Если I/O-bound и пишется с нуля → asyncio (самый эффективный вариант для современных веб-сервисов).

Важно: asyncio и потоки можно комбинировать (например, запускать блокирующие функции в run_in_executor), но это требует аккуратности.

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

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