python - 종료 - 파이썬 프로세스 생성




언제 멀티 프로세싱을 호출해야합니까? (2)

다음과 같이 '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

for 루프 다음에 pool.close 또는 pool.join 을 호출해야합니까?


Levenshtein 거리를 계산하는 함수로 pool.map() 을 사용할 때 pool.close()pool.join() 을 사용하지 않았을 때 메모리 사용량이 Python의 다중 처리 pool.close() 에서 계속 증가 하는 것과 같은 메모리 문제가있었습니다. 이 함수는 정상적으로 작동하지만 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()

닫고 수영장에 합류 한 후 메모리 누수가 사라졌습니다.


아닙니다. 수영장을 더 이상 사용하지 않는 것이 좋습니다.

pool.close 또는 pool.join 을 호출하는 이유는 Tim Peters 가이 SO 게시물 에서 잘 말합니다.

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

또한 Pool.join ()을 호출하여 작업자 프로세스가 종료 될 때까지 기다리는 것이 좋습니다. 다른 이유 중에는 예외를 병렬 코드로보고하는 좋은 방법이 종종 있습니다 (예외는 주 프로그램이 수행하는 것과 막연하게 관련된 문맥에서만 발생합니다). Pool.join ()은 발생 된 일부 예외를보고 할 수있는 동기화 지점을 제공합니다 그렇지 않으면 볼 수 없었던 작업자 프로세스에서





python-multiprocessing