Назад к подготовке

Чем отличаются threading и multiprocessing в Python

Когда выбирать потоки, когда процессы, и как GIL влияет на CPU-bound и IO-bound задачи?

Ответить самому

Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.

Загрузка

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

Threads делят память процесса и удобны для IO-bound задач, но GIL мешает параллельно исполнять Python bytecode на CPU. Processes имеют отдельную память и обходят GIL, но дороже по запуску и обмену данными.

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

Потоки внутри одного процесса разделяют память, поэтому между ними проще передавать объекты, но нужен контроль race conditions. В CPython GIL разрешает исполнять Python bytecode только одному потоку за раз, поэтому CPU-bound Python-код обычно не масштабируется на несколько ядер через threading.

Для IO-bound задач threads могут быть полезны: пока один поток ждет сеть или диск, другой может работать. Многие native операции освобождают GIL, поэтому детали зависят от библиотек.

Multiprocessing запускает отдельные процессы с отдельной памятью и своим GIL. Это подходит для CPU-bound Python work, но у процессов выше overhead, сложнее shared state, нужна сериализация данных, IPC/queues/pipes/shared memory и аккуратное управление worker lifecycle.

Теория

Выбор модели concurrency в Python зависит от bottleneck: IO wait, Python CPU, native compute, размер данных и стоимость коммуникации между workers.

Типичные ошибки

  • Сказать, что threads всегда бесполезны из-за GIL.
  • Игнорировать стоимость передачи больших объектов между процессами.
  • Смешивать concurrency и parallelism.

Как отвечать на собеседовании

  • Сначала спроси: IO-bound или CPU-bound.
  • Назови GIL, но добавь нюанс про IO и native extensions.