2011-01-05 1 views
0

이전에, 나는 $ 세트에 같은 코드에 대해 두 개의 명령을 실행합니다 : 명령 명령을 저장하기 위해 동일한 두 명령을 실행하려면 시간python 실행 동시에 다중 명령

메이크

덕분 threading 모듈 린에

+1

http://docs.python.org/library/threading.html – GWW

+1

에 대해 읽어보십시오. 왜 'subprocess.Popen()'을 사용하지 않습니까? –

답변

3

스레딩 모듈은 전역 인터프리터 잠금 (Global Interpreter Lock)으로 인해 많은 성능을 제공하지 않습니다.

이 방법을 사용하는 가장 좋은 방법은 subprocess 모듈을 사용하고 각 명령을 자체 표준 출력으로 여는 것입니다.

processes = {} 
for cmd in ['cmd1', 'cmd2', 'cmd3']: 
    p = subprocess.Popen('cmd1', stdout=subprocess.PIPE) 
    processes[p.stdout] = p 

while len(processes): 
    rfds, _, _ = select.select(processes.keys(), [], []) 
    for fd in rfds: 
     process = processses[fd] 
     print fd.read() 

     if process.returncode is not None: 
      print "Process {0} returned with code {1}".format(process.pid, process.returncode) 
      del processes[fd] 

당신은 기본적으로 준비가되어있는 파일 디스크립터보고 선택을 사용해야합니다 당신은 "읽기"그들이 종료 발생하고 있는지 확인하기 위해 자신의 반환 코드를 확인해야합니다. 프로세스는 기본적으로 stdout이 닫힐 때까지 대기 상태가됩니다. 기다리는 동안 몇 가지 일을하고 싶다면 select.select()에 시간 초과를 두어 오랜 시간 후에 기다리는 것을 멈출 수 있습니다. rfds의 길이를 테스트 할 수 있고 0이면 시간 초과가 발생했음을 알 수 있습니다.

0

찾는 병렬 방법 등을들 수있다.

1

twisted 또는 select 모듈은 아마도 내가 본 것일 것입니다.

당신이 원하는 모든 배치 명령, 쉘 스크립트의 무리 인 경우, 즉

#!/bin/sh 
for i in "command1 command2 command3"; do 
    $i & 
done 

더 잘 작동 할 수 있음. 또는, 당신이 말하는 Makefile이 말했습니다.