2014-02-03 6 views
0

Я пытаюсь использовать многопроцессорную обработку для обработки массива numpy. Но я не знаю, как вернуть результат процесса обратно в переменную dict.Невозможно изменить глобальную переменную dict с помощью mutliprocessing в python

Использование кода комментариев может привести к тому, что я ожидал. Но когда я пытаюсь использовать многопроцессорную обработку, я ничего не могу получить для max_rslts, это пустой dict.

Пример кода:

from __future__ import print_function 

from multiprocessing import Process 
import numpy as np 

def calc_max(a, step): 
    global max_rslts 
    max_rslts[step] = a[::step].max() 


if __name__ == '__main__': 
    max_rslts = dict() 

    a1 = np.arange(16).reshape(4,4) 

# for i in range(1,4): 
#  calc_max(a1, i) 
# print(max_rslts) 

    jobs = [] 
    for i in range(1,4): 
     p = Process(target=calc_max, args=(a1, i)) 
     jobs.append(p) 
     p.start() 

    for j in jobs: 
     j.join() 

    print(a1) 
    print(max_rslts) 
+0

Да, многопроцессорная делает ** не ** Доля Глобалы набор после '__main__' побежал. Это характер использования нескольких процессов. –

+0

Возможно, вы захотите прочитать [Обмен объектами между процессами] (http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes) в документации по многопроцессорности. – lanzz

ответ

0

Из multiprocessing programming guidelines:

Избегайте общего состояния

global ы не разделяются между процессами после того, как разветвление с каждого подпроцесса. Вместо этого используйте другие средства: share state between processes. dict manager будет работать здесь:

from __future__ import print_function 

from multiprocessing import Process, Manager 
import numpy as np 


def calc_max(a, step, max_rslts): 
    max_rslts[step] = a[::step].max() 


if __name__ == '__main__': 
    manager = Manager() 
    max_rslts = manager.dict() 
    a1 = np.arange(16).reshape(4,4) 
    jobs = [] 
    for i in range(1,4): 
     p = Process(target=calc_max, args=(a1, i, max_rslts)) 
     jobs.append(p) 
     p.start() 

    for j in jobs: 
     j.join() 

    print(a1) 
    print(max_rslts) 
Смежные вопросы