Programing

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

lottogame 2020. 12. 30. 07:39
반응형

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


다음과 같이 '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루프의 후?


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

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

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

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


나는 같은 메모리 문제가 있었다 파이썬의 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()

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

참조 URL : https://stackoverflow.com/questions/38271547/when-should-we-call-multiprocessing-pool-join

반응형