2014-12-05 4 views
1

나는 여러 프로세스에 의해 병렬로 multiprocessing.Queue을 처리하기위한 프로그램을 작성 중이다. 오케스트레이션 부분을 더 깊이 파고 들어갈수록 이해가 덜합니다.다중 프로세스에서 프로세스를 조율하는 방법?

내가 달성하고자하는 것은 여러 프로세스를 시작하고 모든 프로세스가 진행되기 전에 완료되었는지 확인하는 것입니다. 이것은 .join()에 대한 일처럼 들립니다. 나는 다음과 같은 데모 스크립트를 테스트하여 결국

는 (리눅스에서 실행) : 내가 기대했던

import multiprocessing 
import time 

def myproc(): 
    print("hello from {proc}".format(proc=multiprocessing.current_process())) 
    time.sleep(5) 

allproc = [] 
for _ in range(3): 
    p = multiprocessing.Process(target=myproc) 
    allproc.append(p) 
    p.start() 

print("all processes started") 

for p in allproc: 
    print("joining {proc}".format(proc=p)) 
    p.join() 

print("the end") 

이 기능은 immediatly은 "hello"라는 메시지를 인쇄 한 후 잠을 세 번 시작하는 것입니다. 이들 모두가 수면을 마치면 최종 메시지 ("끝")가 인쇄됩니다.

은 내가 실제로 얻을 것은 이것이다 :

hello from <Process(Process-1, started)> 
hello from <Process(Process-2, started)> 
all processes started 
joining <Process(Process-1, started)> 
hello from <Process(Process-3, started)> 
joining <Process(Process-2, stopped)> 
joining <Process(Process-3, stopped)> 
the end 

스크립트를 실행, 그것은 3 "안녕하세요"와 "결합"2 사이에 기다립니다.

예상 된 오케스트레이션을 달성 할 수 있도록 다중 처리 코드를 어떻게 설계해야합니까?

+1

괜찮아 보입니다. 이것은 내가 생각하는 것입니다 : 주 스레드가 조인 줄에 도달하기 전에 세 번째 프로세스가 메시지를 인쇄 할 시간이 있습니다. 그때까지 세 번째 프로세스는 내용을 인쇄하고 기다립니다. 프로세스를 끝내면 주 스레드가 두 번째 프로세스에 참여할 수 있지만 둘은 이미 완료됩니다. 그런 다음 세 번째 프로세스로 이동하지만 그 사람도 수행됩니다 (두 경우 모두 "중지됨"상태에 유의하십시오). 그런 다음, 주요 프로세스는 전제를 떠납니다. –

+0

나는 "전제"를 의미했다. –

답변

0

print("the end") 전에 모든 하위 프로세스가 완료 될 때까지 기다리는 기본 스레드가 있다면 위에서 설명한 설명에 따라 코드가 올바른 것입니다. 코드의 마지막 줄 바로 앞에 print len(multiprocessing.active_children())을 배치하면 0과 동일하다는 것을 알 수 있습니다.

관련 문제