Это может быть действительно глупый вопрос, но я не нашел ни одного документа, который бы прекрасно отвечал на этот вопрос. Я пытаюсь ознакомиться с multiprocessing
библиотекой на python, чтобы попытаться выполнить команду multiprocessing
с помощью multiprocessing.Pool
. Я инициирую количество процессов в моем пуле с помощью: Pool(processes=nmbr_of_processes)
. Дело в том, что я точно не понимаю, как это количество процессов сокращает время продолжительности работы. Я написал сценарий для его оценки.
def test_operation(y):
sum = 0
for x in range(1000):
sum += y*x
def main():
time1 = time.time()
p = mp.Pool(processes=2)
result = p.map(test_operation, range(100000))
p.close()
p.join()
print('Parallel tooks {} seconds'.format(time.time() - time1))
final = list()
time2 = time.time()
for y in range(100000):
final.append(test_operation(y))
print('Serial tooks {} seconds'.format(time.time() - time2))
Дело в том, что когда я использую 2 процесса с mp.Pool(processes=2)
я обычно получаю:
Parallel took 5.162384271621704 seconds
Serial took 9.853888034820557 seconds
И если я использую больше процессов, например p = mp.Pool(processes=4)
я получаю:
Parallel took 6.404058218002319 seconds
Serial took 9.667300701141357 seconds
Я работаю над MacMini DualCore i7 3Ghz. Я знаю, что не могу сократить время работы до половины времени, затраченного на серийную работу. Но я не понимаю, почему добавление большего количества процессов увеличивает продолжительность продолжительности работы по сравнению с работой с двумя процессами. И если есть оптимальное количество процессов для запуска в зависимости от процессора, что бы это было?
Следует отметить, что это относится к задачам, связанным с CPU; ваш код сильно зависит от использования ЦП. Первое, что нужно сделать, это проверить, сколько теоретических ядер у вас есть:
import multiprocessing as mp
print(mp.cpu_count())
Для таких задач, связанных с процессором, нет никакой выгоды для создания пула с большим количеством работников, чем теоретические ядра. Если вы не укажете размер Pool
, он по умолчанию вернется к этому номеру. Однако это пренебрегает чем-то другим; ваш код - это не единственное, что должна выполнить ваша ОС.
Если вы запускаете столько процессов, сколько теоретических ядер, у системы нет выбора, кроме как периодически прерывать ваши процессы, чтобы продолжать работать, поэтому вы, вероятно, получите удар производительности. Вы не можете монополизировать все ядра. Общее правило состоит в том, чтобы иметь размер пула cpu_count() - 1
, который оставляет ОС ядром, которое можно использовать для других процессов.
Я был удивлен, обнаружив, что другие ответы, которые я нашел, не упоминают это общее правило; это похоже на комментарии и т.д. Однако ваши собственные тесты показывают, что они применимы к производительности в вашем случае, поэтому разумная эвристика определяет размер пула.