0

일부 프로세스를 병렬로 실행하고 완료 될 때까지 기다리고 싶습니다.병렬 처리를위한 파이썬 다중 처리 풀

pool = mp.Pool(5) 
for a in table: 
    pool.apply(func, args = (some_args)) 
pool.close() 
pool.join() 

내가 5 개 프로세스가 여기에 병렬로 func을 실행 얻을 것이다 그래서 나는이 코드를 작성? 또는 유일한 옵션은 apply_async입니까?

답변

0

The docs은 매우 명확합니다. 결과가 준비 될 때까지 각각 apply 블록을 호출합니다. apply_async을 사용하십시오.

+1

왜 수영장이 필요합니까? 다중 처리가 필요한 이유는 무엇입니까? apply_ascync를 사용하면 콜백을 지정해야합니다. 나는 병렬로 프로세스를 실행하고, 모든 프로세스를 기다린 다음 다른 작업을 수행하기를 원한다. 특히 저는 작업 테이블 테이블을 가지고 있습니다. 테이블을 반복하면서 각 청크 프로세스를 실행하고이 청크가 끝날 때까지 기다렸다가 병렬 프로세스에서 다음 청크를 실행합니다. 콜백을 사용하면 매우 복잡합니다. – mnowotka

+0

@mnowotka 아니요, 콜백은 선택 사항입니다. 콜백을 통해 또는'apply_async'에 의해 반환 된 객체에서'get'을 호출하여'func'의 반환 값에 접근 할 수 있습니다. 귀하의 예제에서는 반환 값을 전혀 사용하지 않습니다. 이 경우 더 이상 변경하지 않고'apply_async'를 사용할 수 있습니다. –

+0

아니요, 콜백은 모든 프로세스가 완료되었다는 정보도 얻습니다. 반환 값에 대해 신경 쓰지 않아도 다른 청크 프로세스를 생성하려면 이전 청크가 완료되었음을 알아야합니다. 콜백으로 이것을 구현하는 것은 정말 고통 스럽습니다. 그 이유는 자바 스크립트가 (task1, task2) .then (task3)을 말할 수있을 때 많은 약속을 구현 한 이유입니다. – mnowotka

1

또 다른 해결책은 Pool.imap_unordered()

다음 코드는 5 근로자의 풀을 시작 사용하는 것입니다. 그런 다음 세 가지 작업을 풀에 보냅니다. 첫 번째 것은 num = 1, 두 번째 num = 2 등입니다. 함수 imap_unordered은 첫 번째 결과가 표시되면 작업자가 이후 처리를 위해이를 반환 함을 의미합니다. 이 경우 루프는 특정 순서가 아닌 결과를 인쇄합니다.

import multiprocessing 

def calc(num): 
    return num*2 

pool = multiprocessing.Pool(5) 
for output in pool.imap_unordered(calc, [1,2,3]): 
    print 'output:',output 
관련 문제