Чем отличаются 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.