2016-09-05 2 views
3

multiprocessingProcess의 경우 args param을 설정하여 Value, Array을 사용할 수 있습니다.Python : 다중 처리 풀에서 값 및 배열을 사용하는 방법

multiprocessing with Pool 어떻게 사용할 수 있습니까? Value, Array. 문서 방법에는 아무 것도 없습니다.

from multiprocessing import Process, Value, Array 

def f(n, a): 
    n.value = 3.1415927 
    for i in range(len(a)): 
     a[i] = -a[i] 

if __name__ == '__main__': 
    num = Value('d', 0.0) 
    arr = Array('i', range(10)) 

    p = Process(target=f, args=(num, arr)) 
    p.start() 
    p.join() 

    print(num.value) 
    print(arr[:]) 

아래와 같은 코드에서 Value, Array을 사용하려고합니다.

import multiprocessing 


def do_calc(data): 
    # access num or 
    # work to update arr 
    newdata =data * 2 
    return newdata 

def start_process(): 
    print 'Starting', multiprocessing.current_process().name 

if __name__ == '__main__': 
    num    = Value('d', 0.0) 
    arr    = Array('i', range(10)) 
    inputs   = list(range(10)) 
    print 'Input :', inputs 

    pool_size  = multiprocessing.cpu_count() * 2 
    pool   = multiprocessing.Pool(processes=pool_size,initializer=start_process,) 
    pool_outputs = pool.map(do_calc, inputs) 
    pool.close() # no more tasks 
    pool.join() # wrap up current tasks 

    print 'Pool :', pool_outputs 

답변

6

나는 이것에 대한 "이유를"알지도 못하는,하지만 multiprocessing (mp)는 대부분의 Pool 방법으로 전달 기능에 대해 서로 다른 피클 러/unpickler 메커니즘을 사용합니다. 그것은 같은 것들에 의해 만들어진 객체 결과입니다 mp.Value, mp.Array, mp.Lock, ... 그들은 의 선택 initializer 기능 mp.Process에 인수로 전달 될 수 있지만, 이러한 방법에 인수로 전달 될 수 없습니다 mp.Pool().

import multiprocessing as mp 

def init(aa, vv): 
    global a, v 
    a = aa 
    v = vv 

def worker(i): 
    a[i] = v.value * i 

if __name__ == "__main__": 
    N = 10 
    a = mp.Array('i', [0]*N) 
    v = mp.Value('i', 3) 
    p = mp.Pool(initializer=init, initargs=(a, v)) 
    p.map(worker, range(N)) 
    print(a[:]) 

를 그 플랫폼에서 작동이를 얻기 위해 내가 알고있는 유일한 방법이다

[0, 3, 6, 9, 12, 15, 18, 21, 24, 27] 

를 인쇄합니다 때문에 후자의이 작동합니다. (mpfork()를 통해 새로운 프로세스를 생성 곳)

리눅스-Y 플랫폼

, 대신 만들 수 있습니다 mp.Arraymp.Value (등) 전에 모듈 전역으로 언제든지 개체를 당신이 mp.Pool()을한다. fork()에 의해 생성 된 프로세스는 mp.Pool()이 실행될 때 모듈 전역 주소 공간에있는 모든 것을 상속합니다.

그러나 이것은 fork()을 지원하지 않는 플랫폼 ("Windows"읽기)에서는 전혀 작동하지 않습니다.

+0

원래 질문에 대한 답변을 수락하면 새로운 질문에 대한 새로운 문제를 열어야합니다. 그렇지 않으면 게시물은 끝이없고 관련없는 의견의 이해할 수없는 혼란이됩니다. –

관련 문제