2017-03-16 8 views
2

파이썬에서 Pool.apply_async으로 실행 한 결과를 얻고 싶습니다.다중 처리 결과를 얻는 방법 .Pool.apply_async

상위 프로세스의 변수에 결과를 할당하는 방법은 무엇입니까? 콜백을 사용하려고했지만 복잡한 것처럼 보입니다.

class Result(): 
    def __init__(self): 
     self.val = None 

    def update_result(self, val): 
     self.val = val 

result = Result() 

def f(x): 
    return x*x 

pool.apply_async(f, (10,), callback=result.update_result) 

스레드가 실행되고 result.val 업데이트됩니다 그것은 당신의 콜백 호출 결과를 계산합니다

+0

질문을 편집하고 콜백을 사용하여 시도한 코드를 포함 시키십시오. (이는'apply_async()'를 사용하는 유일한 방법입니다.) – martineau

답변

4

이 솔루션은 매우 간단합니다 :

import multiprocessing 

def func(): 
    return 2**3**4 

p = multiprocessing.Pool() 
result = p.apply_async(func).get() 
print(result) 

Pool.apply_async() 이후 다시 표시 AsyncResult, 당신은 단순히 AsyncResult.get() 방법의 결과를 얻을 수 있습니다.

희망이 도움이됩니다.

+0

감사합니다. 이것은 깨끗합니다. get()은 임의의 객체 유형을 반환 할 수 있습니까? – THN

+3

@thn - 대부분 ... 하위 프로세스는 picklable 객체 만 반환 할 수 있습니다. 풀은 부모에게 데이터를 전달하기 위해 데이터를 직렬화해야하며 이것이 그 방법입니다. – tdelaney

+0

알겠습니다. +1은 직렬화를 언급하기 때문에 직렬화의 오버 헤드에 대해 생각해 봐야합니다. – THN

0

음 쉬운 방법은 다음과 같이 헬퍼 클래스가하는 것입니다.

어쨌든 스레드가 완료되었는지 확인해야합니다.

+0

감사합니다. 글로벌 변수가 될까요? 하위 프로세스에서 액세스되는 것입니까? – THN

+1

필요는 없습니다. 그러나 결과는 pool.apply_async 호출과 동일한 범위에 있어야합니다. –

+0

고맙습니다. – THN

관련 문제