Невозможно использовать 100% ЦП / ядер с помощью многопроцессорной обработки. - PullRequest
0 голосов
/ 07 февраля 2020

Я работал с многопроцессорным модулем, пытаясь распараллелить a для l oop, для работы которого на одном ядре требуется 27 минут. В моем распоряжении 12 процессорных ядер.

Ниже приводится описание кода, который я использую, для распараллеливания:

import multiprocessing as mp

def Parallel_Work(val,b,c):
    # Filter basis val to make a dataframe and do some work on it
    # ...

values = pd.Series( [ "CompanyA",
                      "CompanyB",
                      "CompanyC", ] ) # Actual values list is quite big

with mp.Pool(processes=4) as pool:
        results= [pool.apply( Parallel_Work,
                              args = ( val, b, c )
                              ) for val in values.unique() ]

Когда я запускаю этот код, у меня есть столкнуться с двумя вещами, которые я не смог выяснить

  1. Ни один из процессов не работает при максимальной загрузке процессора на 100%. Фактически суммарное использование ЦП всеми процессами каждый раз достигает 100% (ссылка на скриншот прилагается). Действительно ли процессы используют разные ядра? Если нет, то как мне убедиться, что они это делают. enter image description here
    результаты команды "top"

  2. Возникло 4 процесса, однако только 2 активны в любой данный момент момент времени. Я что-то здесь упускаю?

Пожалуйста, дайте мне знать, могу ли я предоставить дополнительную информацию.

1 Ответ

1 голос
/ 07 февраля 2020

Я думаю, вам нужно использовать apply_async вместо apply, который блокирует, пока результат не будет готов.

См. Этот SO вопрос для получения подробной информации о apply, apply_async и map

...