2012-04-06 4 views
0

파이썬 다중 처리를 사용하는 프로그램이 있습니다. 주 프로그램에서 생성 된 모든 프로세스가 완료 될 수 있지만 주 프로그램은 항상 반환 값을 기다리고 중지 할 수 없음을 발견했습니다. 아무도 나 에게이 문제를 해결하는 방법에 대한 몇 가지 제안을 줄 수 있습니까? 다음 프로세스가 파이썬 다중 처리 풀에서 멈출 수 없습니다.

코드 단편

입니다

메인 프로그램 : I는 모든 "서브 기능을 수행"출력을 볼 수

# doing some other jobs 
result = {.....} # a large dictionary 
print 'done with sub functions' 
return result # if I change it to "return 1", it can finish successfully 

workers = multiprocessing.Pool(4) 
args = [arg1, arg2, arg3, arg4] 
results = workers.map(subfunc, args) 
print "we are in main functions " 

subfunc (* ARG) main에서 생성 된 프로세스이지만 "우리는 주요 기능에 있습니다"출력이 없습니다. 아무도 내가 문제를 알 수있게 도와 줄 수 있니?

+2

결과에 길이가 맞는지 테스트 할 수 있습니까? Mayhap이 동작은 결코 루프를 실행하지 않기 때문입니다. – mklauber

+0

결과 사전에 재귀 참조가있어 피클로 만드는 것이 완료되지 않았을 수 있습니다. 피클이나 json으로 stdout에 쓰십시오. – j13r

+0

그게 바로 지금 내가 한 일이야. – hanqiang

답변

2

subfunc이 결과를 반환 한 후에도 하위 프로세스는 결과를 피킹하고 프로세스 간 통신을 통해 마스터 프로세스에 보내야합니다. 그래서 그들은 서브 프로세스가 실제로 종료 준비가되기 전에 "done"을 인쇄하고 있습니다.

"fake"을 반환하여 문제가 없는지 확인한 다음 결과를 프로세스간에보다 신속하게 전달할 수있는 방법에 대해 생각해보십시오. 예를 들어, 목록의 내용에 따라 내용을보다 엄격한 형식으로 패키지화 할 수 있거나 공유 메모리가 실행 가능한 옵션 일 수 있습니다.

+0

subfunc에서 "1"을 반환하면 주 프로그램이 성공적으로 종료 될 수 있습니다. 그래서 지금은이 문제가 반환 된 값의 크기로 인해 발생할 수 있다고 생각합니다. 내 프로그램에서 반환 된 subfunc의 값은 1GB 정도 될 수 있습니다. 그것에 대해 어떻게 생각하십니까? – hanqiang

+0

@hanqiang 그래, 아마도 그때 일 것이다. 어떤 종류의 데이터입니까? 아마도 공유 메모리, [메모리 매핑 파일] (http://docs.python.org/library/mmap.html), 데이터베이스 등을 통해 다른 방법으로 작업자와 마스터간에 통신하고 싶을 것입니다. 평범한 옛날 파일 I/O, 뭔가. – Dougal

+0

와우 ... 왜 내 자식 프로세스가 완료되었다고 말하고 있는지 알기 위해 몇 시간을 보냈지 만 일들은 겉으로는 얼어있었습니다. 그것은이 피클 링이 일어나고 있음을 알았고 간단히 기다릴 필요가있었습니다. – CodeGuyRoss

관련 문제