2017-03-02 2 views
1

아직 파이썬에서 초보자입니다. 확실하지 이것은 내가 다섯 2S인수를 전달할 때 파이썬 다중 처리 풀 async_apply 콜백이 작동하지 않습니다.

from multiprocessing import Pool 

results = [] 

def func(a=1): 
    if a == 1: 
     return 1 
    return 2 

def collect_results(result): 
    results.append(result) 

if __name__=="__main__": 

    poolObjects = [] 

    pool = Pool(processes=2) 

    poolObjects = [pool.apply_async(func, args=(2), callback=collect_results) for i in range(5)] 

    pool.close() 
    pool.join() 

    print results 

를 포함하는 배열을 기대하지만하고 하늘의 배열을 출력 내가 왜이

poolObjects = [pool.apply_async(func, callback=collect_results) for i in range(5)] 

그것은 잘 작동에 poolObjects 라인을 변경하고의 배열을 출력 할 때 5 초. 여기서 내가 뭘 잘못하고 있니?

+1

시도가'인수에 =을 변경 (2)'를'args = (2,)'(쉼표에 유의하십시오). '(2)'는 정확하게'2'와 똑같습니다. * 쉼표는 튜플을 만듭니다 *! – Bakuriu

답변

1

인자를 전달하는 방법에 문제가 있습니다 : args은 튜플 (또는 시퀀스)이어야합니다. 후행 쉼표의 길이가 하나의 튜플을 생성

... args=(2) ... 

... args=(2,) ... 

에 따라서 2

그런 다음 프로그램이 인쇄됩니다 정수를 포함, 변경

[2, 2, 2, 2, 2] 

왜 오류가 발생하지 않았습니까? 당신이 한 ;-) -하지만 그것은 억압되었습니다. 이 오류는 주 프로그램에서는 발생하지 않지만 프로세스 경계를 ​​넘어 작업을 전송하는 백그라운드 기계에서 발생합니다. 이러한 오류를보고하는 좋은 방법이 없으므로 오류가 표시되지 않습니다.

apply_async의 경우 오류가 저장되어 .get()을 결과 개체에 적용하기를 기다리고 있습니다. 과 같이, 억압 된 오류가보고됩니다 다음

for f in poolObjects: 
    f.get() 

:

그래서, 예를 들어, 원래 프로그램의 마지막이 루프를 추가

TypeError: func() argument after * must be a sequence, not int 
+0

오류에 대한 추가 정보를 제공해 주셔서 감사합니다. 원래 코드는 여러 params를 포함하고 실제로 다른 이유로 실패했습니다 (이제 오류를 볼 수 있습니다 :)). 필자가 쓴 샘플 코드는 누락으로 인해 실패했지만, 그 이유는 동일하다고 생각했습니다. – ski