언제 multiprocessing.Pool.join을 호출해야합니까?


96

다음과 같이 'multiprocess.Pool.imap_unordered'를 사용하고 있습니다.

from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
    do some additional processing on mapped_result

내가 전화를해야하나요 pool.close또는 pool.join루프의 후?


나는 일반적으로 전화 pool.join()한 후 pool.close()나는 풀의 모든 스레드를 시작하면,하지만 난 사용하여 시도하지 않은 pool.imap_unordered()반복 가능한다.
Bamcclur

8
조인 또는 닫기 호출의 요점은 무엇입니까? 나는 그들을 부르지 않았고 내 코드가 잘 작동하는 것 같습니다. 그러나 나는 그것을 호출하지 않으면 좀비 프로세스 또는 기타 미묘한 일이 발생할 것이라고 우려됩니다.
HCH

답변:


113

아니요, 그렇지 않습니다.하지만 수영장을 더 이상 사용하지 않는 것이 좋습니다.

이 SO 게시물 에서 Tim Peters가 전화를 걸 pool.close거나 pool.join잘 말한 이유 :

Pool.close ()에 관해서는 풀 인스턴스에 더 많은 작업을 제출하지 않을 때만 호출해야합니다. 따라서 Pool.close ()는 일반적으로 메인 프로그램의 병렬화 가능한 부분이 완료 될 때 호출됩니다. 그런 다음 이미 할당 된 모든 작업이 완료되면 작업자 프로세스가 종료됩니다.

작업자 프로세스가 종료 될 때까지 기다리기 위해 Pool.join ()을 호출하는 것도 좋은 방법입니다. 다른 이유 중에서도 병렬화 된 코드에서 예외를보고하는 좋은 방법이없는 경우가 많으며 (예외는 기본 프로그램이 수행하는 작업과 막연하게 관련된 컨텍스트에서만 발생 함), Pool.join ()은 발생한 일부 예외를보고 할 수있는 동기화 지점을 제공합니다. 그렇지 않으면 결코 볼 수 없었던 작업자 프로세스에서.


9
다른 사람보다 먼저 전화하는 것이 더 낫습니까?
RSHAP

9
사람들은 pool.close()첫 번째와 pool.join()두 번째 전화를 좋아하는 것 같습니다 . 당신이 사이에 작업을 추가 할이 수 pool.close()pool.join()그 실행이 완료 될 때까지 풀 기다릴 필요가 없습니다.
Bamcclur

34
@Bamcclur의 의견에 추가하기 위해- pool.close()먼저 전화하는 것이 좋은 생각이 아니라 실제로 필수입니다. 에서 워드 프로세서 : 하나는 호출해야 close()또는 terminate()사용하기 전에 join().
Bogd

4
@Bogd하지만 필수입니까? 질문에 대답 주시겠습니까?
agdhruv

agdhruvs 질문에 대한 답은 굉장 할 것입니다!
채찍

44

나는 같은 메모리 문제가 있었다 파이썬의 multiprocessing.pool로 성장하고 메모리 사용 킵 내가 사용하지 않은 경우를 pool.close()하고 pool.join()사용하는 경우 pool.map()Levenshtein 거리를 계산하는 기능. 이 기능은 잘 작동했지만 Win7 64 시스템에서 제대로 가비지 수집되지 않았으며 전체 운영 체제가 다운 될 때까지 함수가 호출 될 때마다 메모리 사용량이 계속해서 제어 할 수 없게되었습니다. 누수를 수정 한 코드는 다음과 같습니다.

stringList = []
for possible_string in stringArray:
    stringList.append((searchString,possible_string))

pool = Pool(5)
results = pool.map(myLevenshteinFunction, stringList)
pool.close()
pool.join()

풀을 닫고 결합한 후 메모리 누수가 사라졌습니다.


1
나는 ERROR: Terminated with signal 15정리 코드를 추가하기 전에 얻었 pool.close();pool.join();지만 그 정리 코드를 추가 한 후에 콘솔 메시지를 얻지 못했습니다. 그래서 나는 적어도 내 버전, C7의 파이썬 2.7에서 풀이 어떻게 든 정확히 정리되지 않았을 것이라고 생각합니다.
Trevor Boyd Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.