multiprocessing - Влияние числа на процесс на время обработки

1

Это может быть действительно глупый вопрос, но я не нашел ни одного документа, который бы прекрасно отвечал на этот вопрос. Я пытаюсь ознакомиться с 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. Я знаю, что не могу сократить время работы до половины времени, затраченного на серийную работу. Но я не понимаю, почему добавление большего количества процессов увеличивает продолжительность продолжительности работы по сравнению с работой с двумя процессами. И если есть оптимальное количество процессов для запуска в зависимости от процессора, что бы это было?

Теги:
multiprocessing

1 ответ

2

Следует отметить, что это относится к задачам, связанным с CPU; ваш код сильно зависит от использования ЦП. Первое, что нужно сделать, это проверить, сколько теоретических ядер у вас есть:

import multiprocessing as mp
print(mp.cpu_count())

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

Если вы запускаете столько процессов, сколько теоретических ядер, у системы нет выбора, кроме как периодически прерывать ваши процессы, чтобы продолжать работать, поэтому вы, вероятно, получите удар производительности. Вы не можете монополизировать все ядра. Общее правило состоит в том, чтобы иметь размер пула cpu_count() - 1, который оставляет ОС ядром, которое можно использовать для других процессов.

Я был удивлен, обнаружив, что другие ответы, которые я нашел, не упоминают это общее правило; это похоже на комментарии и т.д. Однако ваши собственные тесты показывают, что они применимы к производительности в вашем случае, поэтому разумная эвристика определяет размер пула.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню