Пул рабочих - это эффективный шаблон проектирования, когда ваша работа может быть разделена на отдельные единицы работ, которые могут быть распределены между несколькими работниками.
Для этого вам нужно разделить ваш вклад на куски и распределить эти куски каким-либо образом всем рабочим. multiprocessing.Pool
использует процессы ОС для рабочих и один канал ОС в качестве транспортного уровня.
Это приводит к значительным накладным расходам, которые часто называют стоимостью межпроцессного взаимодействия (IP C).
В вашем конкретном примере c вы генерируете в основном процессе большой набор данных, используя функцию random.sample
. Это само по себе требует довольно много ресурсов. Затем вы отправляете каждую выборку в отдельный процесс, который выполняет очень тривиальные вычисления.
Излишне говорить, что большую часть времени тратится на основной процесс, который должен генерировать большой набор данных, делить он порциями размера 1 (так как это значение по умолчанию для pool.imap
) отправляет каждый кусок работникам и собирает возвращенные значения. Все рабочие процессы в основном бездействуют, ожидая, пока основной из них начнет работать.
Если вы попытаетесь смоделировать некоторые вычисления для вашей функции f
, вы заметите, как все ядра становятся занятыми.