2017-01-23 1 views
0

다중 처리 함수를 실행하고 어레이에 출력을 저장하려고 시도하지만 그렇게 할 방법을 찾을 수 없습니다. 이것은 내가 지금까지 가지고 무엇을 : 무슨 일이에요파이썬 다중 처리 : 다중 처리 명령에서 배열 검색

resultsAr = [] 
inputData = [a,b,c,d]#THIS ARRAY CONTAINS DATA 

def function(data): 
    values = [some_Number_1, some_Number_2] 
    resultsAr.append(values)   
    print ('Values = ', values) #THIS WORKS - THE CORRECT VALUES ARE PRINTED 
    print ('resultsAr = ', resultsAr) #WORKS AS WELL 

def parallel_run(function, inputData): #a function that runs in multiple processors  
    cpu_no = 4 
    if len(inputData) < cpu_no: 
     cpu_no = len(inputData) 
    p = multiprocessing.Pool(cpu_no) 
    p.starmap_async(function, inputData, chunksize=1) 
    p.close() 
    p.join() 
    print ('resultsAr = ', resultsAr) # THIS PRINTS OUT AN EMPTY ARRAY! 

parallel_run(function, inputData) 

답변

1

파이썬이 수영장에서 당신을 위해 자식 프로세스를 회전, 당신을 위해 그 과정을 통해 다음 복사 입력 데이터된다는 점이다. 이제 하위 프로세스에 원본 복사본이 있으며 function은 해당 사본을 변경합니다. 그래서 변이가 function에 인쇄 진술서에 나타납니다. 부모 프로세스에서 다시 돌연변이가 발생하지 않으므로 실행이 해당 프로세스로 돌아 오면 원본 resultsAr은 변경되지 않았습니다. 당신은을 전달하는 등, 또한

resultsAr = [] 
inputData = [a,b,c,d] 

def function(data): 
    values = [some_Number_1, some_Number_2] 
    return values 

def parallel_run(function, inputData): 
    cpu_no = 4 
    if len(inputData) < cpu_no: 
     cpu_no = len(inputData) 
    p = multiprocessing.Pool(cpu_no) 
    # this needs to be declared global to mutate 
    # the resultsAr defined in the enclosing scope 
    global resultsAr 
    resultsAr = p.map(function, inputData, chunksize=1) 
    p.close() 
    p.join() 
    print ('resultsAr = ', resultsAr) 

, 당신이 준 예는 예외를 발생한다 :

정식 방법은 여기서 설명하는 것은 너무처럼 Pool.map 전화를 사용하는 일을합니다 매개 변수 (inputData의 요소)를 인수가없는 함수 (function)에 전달합니다. 실제로 여기서 매개 변수를 function에 넣으려는 것으로 가정합니다.

+0

! 하지만 어떻게 결과를 인쇄/액세스 할 수 있습니까? resultsAr가 더 이상리스트가 아니라'MapResult' 인 것처럼 보입니다. (map이 아닌'starmap_async' 함수를 사용해야했습니다. 차이가 있는지 확실하지 않습니다.) – Yair

+0

어떤 Python 버전을 사용하고 있으며 멀티 프로세싱을 어떻게 가져 오나요? 내 문서와 내 로컬 Python 설치 모두'pool.map'이 반복 가능을 반환한다는 것에 동의합니다. (내 컴퓨터에서는 목록입니다) –

+0

'pool.map' 대신'pool.starmap_async'를 사용하고 있습니다 (my 기능). 'starmap_async'가 반복 가능한지에 대한 어떤 증거도 찾을 수 없었습니다. Windows PC에서 파이어 폭스 3.5.1을 anaconda spyder 2.3.8과 함께 사용하고 있습니다. import multiprocessing에 의해 import한다. – Yair

0

위의 대답을 바탕으로 pool.starmap_async은 반복 불가능한 인스턴스를 검색하는 것으로 나타났습니다. 이 때문에 같은 코드에 get 표현을 추가하여 해결되었습니다

(적어도 부분적으로) 감사 @Haldean 브라운을 작동
resultsAr = [] 
inputData = [a,b,c,d] 

def function(data): 
    values = [some_Number_1, some_Number_2] 
    return values 

def parallel_run(function, inputData): 
    cpu_no = 4 
    if len(inputData) < cpu_no: 
     cpu_no = len(inputData) 
    p = multiprocessing.Pool(cpu_no) 

    global resultsAr 
    resultsAr = p.starmap_async(function, inputData, chunksize=1) 
    real_result = resultsAr.get() 

    p.close() 
    p.join() 
    print ('real_result = ', real_result)