многопроцессорность не с использованием всех ядер - PullRequest
5 голосов
/ 27 апреля 2020

Я написал пример сценария, и у меня возникают проблемы после переустановки Ubuntu 20.04. Похоже, что многопроцессорность использует только одно ядро. Вот мой пример сценария:

import random
from multiprocessing import Pool, cpu_count

def f(x): return x*x

if __name__ == '__main__':
    with Pool(32) as p:
        print(p.imap(f,random.sample(range(10, 99999999), 50000000)))

И изображение моей обработки ниже. Любая идея, что может вызвать это?

enter image description here

1 Ответ

8 голосов
/ 02 мая 2020

Пул рабочих - это эффективный шаблон проектирования, когда ваша работа может быть разделена на отдельные единицы работ, которые могут быть распределены между несколькими работниками.

Для этого вам нужно разделить ваш вклад на куски и распределить эти куски каким-либо образом всем рабочим. multiprocessing.Pool использует процессы ОС для рабочих и один канал ОС в качестве транспортного уровня.

Это приводит к значительным накладным расходам, которые часто называют стоимостью межпроцессного взаимодействия (IP C).

В вашем конкретном примере c вы генерируете в основном процессе большой набор данных, используя функцию random.sample. Это само по себе требует довольно много ресурсов. Затем вы отправляете каждую выборку в отдельный процесс, который выполняет очень тривиальные вычисления.

Излишне говорить, что большую часть времени тратится на основной процесс, который должен генерировать большой набор данных, делить он порциями размера 1 (так как это значение по умолчанию для pool.imap) отправляет каждый кусок работникам и собирает возвращенные значения. Все рабочие процессы в основном бездействуют, ожидая, пока основной из них начнет работать.

Если вы попытаетесь смоделировать некоторые вычисления для вашей функции f, вы заметите, как все ядра становятся занятыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...