0

멀티 프로세싱 모듈을 사용할 때 공유 변수 (네임 스페이스에서 numpy 배열)를 업데이트하려고합니다. 그러나 변수는 업데이트되지 않으며 그 이유를 이해하지 못합니다.멀티 프로세싱 공유 변수가 업데이트되지 않습니다.

from multiprocessing import Process, Manager 
import numpy as np 

chunk_size = 15 
arr_length = 1000 
jobs = [] 
namespace = Manager().Namespace() 
namespace.arr = np.zeros(arr_length) 
nb_chunk = arr_length/chunk_size + 1 


def foo(i, ns): 
    from_idx = chunk_size*i 
    to_idx = min(arr_length, chunk_size*(i+1)) 
    ns.arr[from_idx:to_idx] = np.random.randint(0, 100, to_idx-from_idx) 

for i in np.arange(nb_chunk): 
    p = Process(target=foo, args=(i, namespace)) 
    p.start() 
    jobs.append(p) 
for i in np.arange(nb_chunk): 
    jobs[i].join() 

print namespace.arr[:10] 

답변

0

문제를 Manager().Namespace() 오브젝트가 발견되지 않는 것이 프로세스 사이에서 데이터를 공유하기 위해, Python's multiprocessing 두 데이터 구조를 제공한다 내부 데이터 구조에서 작업 할 때 ns.arr[from_idx:to_idx] = ...을 사용하여 무엇이든지 변경 중이므로 다른 프로세스로 전파되지 않습니다.

This answer 여기에 무슨 일이 일어나고 있는지 아주 잘 설명합니다.

Manager().List()으로 목록을 작성, 그것을 수정하고 ns[from_idx:to_idx] = ...이 변경으로 인식하고 프로세스에 전파 될 수 있도록, 프로세스에이 목록을 전달하려면 :

from multiprocessing import Process, Manager 
import numpy as np 

chunk_size = 15 
arr_length = 1000 
jobs = [] 
arr = Manager().list([0] * arr_length) 

nb_chunk = arr_length/chunk_size + 1 


def foo(i, ns): 
    from_idx = chunk_size*i 
    to_idx = min(arr_length, chunk_size*(i+1)) 
    ns[from_idx:to_idx] = np.random.randint(0, 100, to_idx-from_idx) 

for i in np.arange(nb_chunk): 
    p = Process(target=foo, args=(i, arr)) 
    p.start() 
    jobs.append(p) 
for i in np.arange(nb_chunk): 
    jobs[i].join() 

print arr[:10] 
1

당신은 파이썬에서 프로세스간에 list, dict 같은 오브젝트를 구축에-공유 할 수 없습니다 : 여기

이를 설명하는 샘플 코드입니다.

또한 읽기 : Exchanging objects between processes

+0

좋아,하지만 난 방법을 취할 수 각 프로세스에서 배열의 동일한 메모리 공간에 액세스하지 않는다는 이점이 있습니까? – GuillaumeA

+0

당신의 현재 코드와 비슷하게, 함수 ('foo()'에 인수로서 건네주기). [여러 비동기 함수를 실행하고 각 함수의 반환 값 가져 오기]를 참조하십시오. (http://stackoverflow.com/questions/40536287/running-multiple-asynchronous-function-and-get-the-returned-value-of- each-functi), 내가 과거에 물어 본 질문. 'Queue'의 사용법에 대한 답을 얻고 있습니다. –