2011-01-05 10 views
0

これに先立ち、同じ時間に複数のコマンドを実行します。時間を節約するために コマンド 、私は同じではこれら2つのコマンドを実行したいです時間、メイクファイル

おかげthreadingモジュールで Lyn(リン)

+1

http://docs.python.org/library/threading.htmlを参照してください。 – GWW

+1

なぜ 'subprocess.Popen() 'を使用していませんか? –

答えて

3

スレッドモジュールは、グローバルインタープリタロックのためにパフォーマンスが向上しません。

私はこれを行う最良の方法は、subprocessモジュールを使用し、それ自身のstdoutで各コマンドを開くことだと思います。

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が言いました。

関連する問題