여기에 프로그램의 이걸 없애 버려? 2.7로 maxtasksperchild를 시도했지만 도움이되지 않았습니다.메모리 사용량이 파이썬의 multiprocessing.pool로 성장을 계속
나는 다른 모든 요인을 피하기 위해 이미 6G + RES를 얻었으며 ~ 1.5M 지점에서 apply_async() ~ 6M 번을 호출하는 더 복잡한 프로그램을 가지고 있으며 위의 버전으로 프로그램을 단순화했습니다.
편집 : 모든 사람의 입력
,이 버전이 더 잘 작동 밖으로 켜지고 감사 : 나는 주요 프로세스가 단일 스레드입니다 생각으로 내가 거기에있는 잠금 장치를 두지 않았다
#!/usr/bin/python
import multiprocessing
ready_list = []
def dummy_func(index):
global ready_list
ready_list.append(index)
def worker(index):
return index
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=16)
result = {}
for index in range(0,1000000):
result[index] = (pool.apply_async(worker, (index,), callback=dummy_func))
for ready in ready_list:
result[ready].wait()
del result[ready]
ready_list = []
# clean up
pool.close()
pool.join()
(콜백입니다 필자가 읽은 문서 당 이벤트 중심의 작업과 비슷합니다.)
v1의 색인 범위를 v2와 동일하게 변경하여 몇 가지 테스트를 수행했습니다. v2가 v1 (33s 대 37s)보다 10 % 더 빠르다고해도 이상한 일입니다. v1이 너무 많은 내부 목록 유지 관리 작업을 수행하고있을 수도 있습니다. v2는 300M (VIRT)과 50M (RES)을 넘지 못했으며, v1은 370M/120M이었고, 최고는 330M/85M이었습니다. 모든 수치는 단지 3 ~ 4 배의 테스트로 참조 용이었습니다. map_async
대신 apply_async
의
그냥 여기에 추측하지만 백만 개의 개체를 큐에 넣으면 공간이 필요합니다. 아마도 일괄 처리하는 것이 도움이 될 것입니다. 문서는 명확하지 않지만 [예제] (http://pydoc.net/Python/multiprocessing/2.6.2.1/multiprocessing.examples.mp_pool/) (Testing 콜백 검색)에서는 apply_async 결과가 대기중인 것을 알 수 있습니다. 콜백이 있습니다. 결과 대기열을 지우려면 대기가 필요할 수 있습니다. – tdelaney
그래서 callback은 실제로 정리 작업을 수행하지 않으므로 multiprocessing.pool이 올바른 도구가 아닐 수 있습니다. 콜백에서 정리가 가능합니까? 문제는 실제 작업자()가 요청 당 0.1 초 (여러 HTTP 요청)가 걸리므로 apply_async() 호출을 기다릴 수 없다는 것입니다. –
야생 추측 :'apply_asynch'는 ['AsynchResult'] (http://docs.python.org/2/library/multiprocessing.html#multiprocessing.pool.AsyncResult) 인스턴스를 만듭니다. 'Pool'은 계산이 끝났을 때 결과를 반환 할 수 있어야하기 때문에 이러한 객체에 대한 참조를 가지고있을 것입니다. 그러나 루프에서 단순히 던져 버릴뿐입니다. 아마도 어쩌면'apply_asynch'의'callback' 인자를 사용하여 어떤 시점에서 비동기 결과에 대해'get()'또는'wait()'를 호출해야 할 것입니다. – Bakuriu