2011-10-04 8 views
20

파이썬 다중 처리 라이브러리를 사용하는 동안 이상한 문제가 발생했습니다.파이썬 다중 처리 - 프로세스 완료시 메모리를 해제하는 방법?

내 코드는 아래 그림과 같습니다. 각 "기호, 날짜"튜플에 대한 프로세스가 생성됩니다. 그 결과를 나중에 결합합니다.

프로세스가 "심볼, 날짜"튜플을 계산할 때 메모리를 해제해야한다고 생각합니까? 명백하게 그것은 사실이 아니다. 나는 수십 개의 프로세스를 보았지만 (프로세스 풀을 크기 7로 설정 했음에도 불구하고) 시스템에서 일시 중단 된 ¹을 볼 수 있습니다. CPU를 소비하지 않으며 메모리를 해제하지 않습니다.

계산을 완료 한 후에 프로세스가 메모리를 해제하도록하려면 어떻게해야합니까?

감사합니다. "중단"나는 ps 명령 자신의 상태가로 표시됩니다 의미 "S +"

def do_one_symbol(symbol, all_date_strings): 
    pool = Pool(processes=7) 
    results = []; 
    for date in all_date_strings: 
     res = pool.apply_async(work, [symbol, date]) 
     results.append(res); 

    gg = mm = ss = 0; 
    for res in results: 
     g, m, s = res.get() 
     gg += g; 
     mm += m; 
     ss += s; 

답변

22

는 부모 프로세스가 실행에 유지하고 그들이 zombies

+0

이 내 스크립트의 근본 원인으로 인해 4GB의 메모리의 90 %가 소비되었다>에 노드 재부팅이 발생했다 :) 감사합니다! –

11

이 설정 시도가 될 것이다 자식 프로세스 대기하지 않는 경우 때문에, pool.close를 사용하여 풀을 닫고 pool.join에 의해 완료 프로세스를 기다리려고 했 풀의 maxtasksperchild 인수. 그렇지 않으면 프로세스가 풀에 의해 계속해서 다시 사용되므로 메모리가 절대로 해제되지 않습니다. 설정되면 프로세스가 죽을 수 있고 새 프로세스가 만들어집니다. 그러면 효과적으로 메모리가 정리됩니다.

내가 그것을 2.7의 새로운 같아요 http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

+0

나는이 접근 방식을 사용하여 잘 작동한다. 질문은, 왜 그것은 기억을 풀어 내지 않는 것입니까? 아니면 충분히 빠르지 않을 수도 있습니다 ... ?? – Elvin

관련 문제