Короткий ответ
Потоки выбирают, когда программа в основном ожидает ввода-вывода: чтение файлов, сетевые запросы, работа с базой данных. Multiprocessing выбирают для задач, нагружающих процессор, так как каждый процесс имеет собственный интерпретатор и собственный GIL.
Как это работает подробнее
Ключ к выбору — где находится узкое место: в ожидании внешних ресурсов или в вычислениях.
- I/O-bound сценарии. Поток почти всё время ждёт ответа от сети, диска или базы; из-за GIL параллельно исполняется лишь один поток, но остальные успевают работать в паузах ожидания, поэтому суммарная пропускная способность растёт.
- CPU-bound сценарии. Для сложных вычислений и обработки больших данных GIL мешает потокам одного процесса исполняться параллельно, поэтому создают несколько процессов.
- Изоляция. У каждого процесса свой интерпретатор и свой GIL, поэтому они реально работают на разных ядрах, а ошибка в одном процессе не остановит остальные.
- Комбинирование. В крупных приложениях оба подхода часто сочетают под разные части системы.
Что использовать на практике
- Потоки. Используй для сетевых запросов, чтения файлов и работы с базой данных, где много ожидания.
- Процессы. Используй для пересчётов, обработки больших данных и математических расчётов.
- Асинхронность. Для I/O-bound задач рассмотри также asyncio как более лёгкую альтернативу потокам.
Подводные камни
- Неверный выбор. Потоки не ускорят вычисления из-за GIL: параллелизма по CPU не будет.
- Накладные расходы. Создание процессов дорого, поэтому не плоди их ради каждой мелкой операции.
- Синхронизация. В потоках общие данные надо защищать блокировками, иначе возникают гонки данных.
Как отвечать на собеседовании
- Сформулируй правило выбора по типу нагрузки: ожидание ввода-вывода — потоки, вычисления — процессы → объясни роль GIL → приведи примеры задач каждого типа → упомяни изоляцию процессов и возможность комбинировать подходы.