Как заставить Pool использовать определенное количество ядер на процесс? - PullRequest
0 голосов
/ 24 мая 2019

Я использую multiprocessing.Pool, чтобы распараллелить некоторые вычисления в проекте.Как я могу сказать пулу использовать n (например, 4) ядер на параллельный процесс?

Скажем, у меня 8 ядер.Будет ли этот код обеспечивать, чтобы каждый параллельный процесс работал на 4 ядрах?

from multiprocessing import Pool

def fun(in):
    print(in)

pool = Pool(2)
pool.map(fun, [1, 2, 3, 4, 5, 6])

Ответы [ 2 ]

1 голос
/ 24 мая 2019

multiprocessing.Pool не будет создавать несколько потоков на процесс, а несколько однопоточных процессов. «Параллельные процессы» означают несколько параллельных процессов, а не отдельные процессы, которые как-то параллельны внутри себя.

Каждый процесс в multiprocessing.Pool будет работать одновременно только на одном ядре, поэтому вы должны создавать столько процессов, сколько вы хотите, чтобы использовались ядра - в этом случае, если вы хотите потенциально использовать все восемь ядер, вам нужно восемь процессов в пуле:

pool = Pool(8)

Вы также не можете передавать аргумент вообще, и Pool автоматически выделит столько процессов, сколько у вас ядер ЦП.

Документация для multiprocessing.Pool:

процессов - количество рабочих процессов, которые нужно использовать. Если обрабатывает , равное None, то используется число, возвращаемое os.cpu_count().

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

0 голосов
/ 24 мая 2019

Нет, ваш код позволит Pool создать два процесса (каждый из которых использует одно ядро), а map() обработает вашу коллекцию предметов через назначенную функцию в двух потоках.

Я думаю, вы могли бы иметь в виду:

pool = Pool(4)

Это будет означать, что ваш fun будет работать на 4 ядрах одновременно.

...