2016-12-15 3 views
0

많은 하위 프로세스를 실행하는 스크립트에서 작업하고 있습니다. 스크립트는이 스크립트를 모두 실행할 수 있어야하며 완료되면 루프를 체크 인하십시오.하위 프로세스를 기다리지 말고 나중에 returncode를 확인하십시오.

하나가 시작되지 않았 으면 끝날 때까지 기다렸다가 다음 시작을 기다립니다. 예를 들어

:

sp1 = subprocess.Popen(["sleep 60", shell=True) 
sp2 = subprocess.Popen(["sleep 10", shell=True) 
sp3 = subprocess.Popen(["sleep 80", shell=True) 

sp1_done = False 
sp2_done = False 
sp3_done = False 
while not sp1_done and not sp2_done and not sp3_done: 
    if sp1.returncode and not sp1_done: 
     print("sp1 done") 
     sp1_done = True 
    if sp2.returncode and not sp2_done: 
     print("sp2 done") 
     sp2_done = True 
    if sp3.returncode and not sp3_done: 
     print("sp3 done") 
     sp3_done = True 

print("all done") 

내가 하나가

sp1_data = sp1.communicate()[0]와 함께 서브 프로세스의 에러 코드에 액세스 할 수 있는지 읽은 다음

그러나이 같은 returncode = sp1.returncode와, 스크립트는 sp1이 완료되기를 기다립니다.

여러 개의 하위 프로세스를 실행할 수 있지만 완료 될 때까지 기다리지 않고 (예 : 반환 코드를 확인하여) 완료되었는지 확인하십시오.

+1

프로세스 당 하나의 스레드를 생성하고 거기에서'subprocess.Popen'을 실행할 수 있습니다. 좋은 amiga 그림 btw. –

+0

Python 스레딩에 대한 경험이 없지만 감사합니다. 하하 ~ 예! 그것은 아름다움! – SaAtomic

+1

진 프랑수아 파브르 (Jean-François Fabre)가 말한 것에 대해 자세히 설명하려면 내장 "스레드"라이브러리를 사용해보십시오 (실제로 파이썬 3에서는 "_thread"라고 생각합니다). thread.start_new를 사용하여 새 스레드를 시작합니다. 그것은 복잡한 개념을위한 매우 간단한 라이브러리입니다. 인터넷 검색 "파이썬 스레드 설명서"보십시오. – Douglas

답변

1

시작된 각 하위 프로세스에 대해 폴링 메소드를 사용해야합니다. 그리고 returncode가 None이 아닌지 확인하십시오 :

while .... # as written 
    sp1.poll() 
    sp2.poll() 
    sp3.poll() 
    if sp1.returncode is not None and not sp1_done: 
      .... # as written 
    ... # as written 
+0

의도 한대로 작동합니다! 그러나 다른 사람들이 제안한 것처럼 스레드 구현을 고려해야합니다. – SaAtomic