2017-01-03 4 views
2

Я пытаюсь использовать некоторую многопроцессорную обработку с помощью python, чтобы увеличить скорость некоторой функции, я знаю, что создание процесса имеет большую стоимость, но моя функция принимает что-то за 3 секунды для выполнения в последовательный, поэтому я думал, что некоторая многопроцессорная обработка может сделать трюк.Многопроцессор медленнее, чем последовательный Python 3.5

Я ошибался (большой крик), многопроцессорность кажется медленнее или, по крайней мере, не быстрее. Чтобы поместить некоторый контекст здесь, что у меня был до многопроцессорной обработки:

for i in range(0, 3): 
    for j in range(0, 3): 
     result = my_function(my_args) 

А теперь то, что я с многопроцессорной обработкой:

pool = Pool() 

for i in range(0, 3): 
    for j in range(0, 3): 
     result = pool.apply_async(my_function,my_args).get() 

pool.close() 
pool.join() 

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

То есть рабочая нагрузка на малую, чтобы использовать многопроцессорную обработку, или я что-то не так?

EDIT:

Как некоторые говорили, что работал последовательный, потому что я использовал получить каждый раз, когда мне нужно, чтобы использовать его в конце после того, как присоединиться, но теперь у меня есть случайное исключение, выскочить время от времени, здесь конец TRACEBACK:

Файл "/home/rtodo/anaconda3/lib/python3.5/multiprocessing/pool.py", строка 608, в прибудете повышают self._value IndexError: поп указательным из диапазон

вот мой код исправлен

pool = Pool() 
for i in range(0, 3): 
    for j in range(0, 3): 
     neigbhourhood[i][j] = pool.apply_async(my_function,my_args) 



for k in range(0, 3): 
    for l in range(0, 3): 
      neigbhourhood[i][j] = neigbhourhood[i][j].get() 

pool.close() 

Где neigbhourhood представляет собой массив 3x3.

Редактирование: Я немного изменил код, теперь пул закрывается после get и я не использую join.

+3

Какой процессор и ОС вы используете? Кроме того, действительно ли этот код выполняет вызовы функций в параллели? Я думаю, что он будет запускать его последовательно, поскольку он, кажется, дождался результата перед запуском следующего вызова. – skyking

+1

Вы не должны сначала называть 'get()'. Вы вызываете 'get()' после выполнения всех заданий. Таким образом, вы запускаете все подряд, как сказал skyking. – justhalf

+0

Я на Debian, и у меня есть Intel Core i3-4005U 1,7 ГГц, поскольку вызовы функций работают в параллельном режиме. Я честно понятия не имею, я не знаком с многопроцессорной обработкой на python, поэтому я не знаю, делать это таким образом - это правильный способ сделать некоторые параллели. –

ответ

4

В двух примерах нет (реальной) разницы, так как .get() будет ждать завершения процесса. Таким образом, ваш многопроцессорный пример будет также последовательным, но потребуется больше времени, так как он запускает процессы на разных узлах.

Сначала запустите все ваши процессы и дождитесь результатов после.

pool = Pool() 
futures = [] 
for i in range(0, 3): 
    for j in range(0, 3): 
     futures.append(pool.apply_async(my_function,my_args)) 

# You can also make some additional calculation here if you want 

# 
# Lets see if the multiprocess stuff is finished 
for i in futures: 
    i.get() 


pool.close() 
# pool.join() 

Вы можете оставить из .join(), а также, потому что это не возможно, что основной процесс завершится раньше, чем дочерние процессы.

+0

Да, вы правы, но теперь у меня есть странная ошибка, возникающая время от времени, см. Редактирование сообщения. –

+0

Какая линия 608? Поскольку я упоминал '.join()' бесполезно, и это может создать проблемы. –

+0

Также вы закрываете пул до завершения задач. Не делай этого. –