Чем отличается мультипоточность от мультипроцессности
Что проверяют
Знаете ли вы, где в вашем конвейере узкое место, и умеете ли подобрать инструмент под тип нагрузки. Для работы с данными вопрос прикладной: параллельная выгрузка из десятка источников и параллельный пересчёт признаков решаются по-разному, а ошибка выбора стоит часов расчёта.
Как отвечать
Потоки живут внутри одного процесса и делят память, процессы изолированы и обмениваются данными через сериализацию. Отсюда следует всё остальное.
- Нагрузка упирается в ожидание (сеть, диск, ответ базы): потоки или асинхронность. Пока поток ждёт, он не занимает процессор, и сотня одновременных запросов обходится дёшево.
- Нагрузка упирается в вычисления на чистом Python: процессы. Глобальная блокировка интерпретатора в CPython не даёт двум потокам одновременно исполнять байткод, поэтому на счётной задаче потоки ускорения не дают.
- Вычисления идут внутри библиотек: часто хватает и потоков. Операции numpy и вызовы BLAS освобождают блокировку на время работы в нативном коде.
Обязательно про цену изоляции: в multiprocessing аргументы и результат проходят через pickle, поэтому передавать в воркеры гигабайтный датафрейм дорого, разумнее отдавать путь к файлу или диапазон ключей. Стоит добавить, что способ запуска дочернего процесса зависит от системы, и при запуске через spawn модуль импортируется заново, а созданные заранее глобальные объекты туда не переезжают.
Где спотыкаются
Говорят, что потоки всегда быстрее. Для счётной задачи на чистом Python это неверно, а с учётом переключений контекста многопоточная версия нередко оказывается даже медленнее однопоточной.
Второе: множат процессы по числу задач. Каждый процесс это отдельная копия интерпретатора со своей памятью, поэтому размер пула привязывают к числу ядер, а не к длине очереди, иначе машина уходит в своп и считает медленнее всего.
Третье: забывают про общее состояние в потоках. Счётчик, словарь кэша или клиент базы, один на все потоки, требуют блокировки или потокобезопасной очереди, и ошибки такого рода не ловятся тестами, а воспроизводятся только под нагрузкой.