2012-08-26 12 views
6

に私はPythonスクリプトrun.pyありますを実行し、いくつかのPythonプログラム同時に

def do(i): 
    # doing something with i, that takes time 

start_i = sys.argv[1] 
end_i = sys.argv[2] 
for i in range(start_i, end_i): 
    do(i) 

をそれから私は、このスクリプトを実行します。

python run.py 0 1000000 

30分スクリプトが完了した後。 しかし、それは私にとっては長すぎます。

だから、私はbashスクリプトrun.sh作成:

python run.py 0 200000 & 
python run.py 200000 400000 & 
python run.py 400000 600000 & 
python run.py 600000 800000 & 
python run.py 800000 1000000 

をそれから私は、このスクリプトを実行します。

bash run.sh 

6分のスクリプトが完了したら。 よろしくお願いします。私は満足しています。

しかし私は、(bashスクリプトを作成せずに)問題を解決する別の方法があると思いますか?

答えて

10

:単一のコマンドにこれを統合するほか

from multiprocessing import Pool 
p = Pool(5) # like in your example, running five separate processes 
p.map(do, range(start_i, end_i)) 

いくつかのプロセスが取る場合は、これ等python run.py 0 200000 &を呼び出すのあなたのアプローチを介して他の利点を持っています(したがって、python run.py 0 200000が他のものの前に終了する可能性があります)、これは5つのスレッドがすべて完了するまですべてのスレッドが動作し続けることを確認します。

ご使用のコンピュータのアーキテクチャによっては、同時に実行するプロセスが多すぎると処理速度が遅くなる場合があります(まず、プロセッサのコア数、実行中のコア数によって異なります)時間)。

+0

私はそれを試しました。それはとてもうまくいく!ありがとうございました – imkost

+0

あなたは大歓迎です –

+1

@imkost: 'p.map()'の戻り値を使用しない場合、 'for _ in p.imap_unordered(do、range(start_i、 end_i)):pass'。 – jfs

0

あなたは、あなたのpythonプログラムにbashの代わりに独立したプロセスを作成させることができますが、それほど違いはありません。不十分であるとあなたの解決策についてはどうですか?あなたがmultiprocessingパッケージ、および特にPoolクラスを探している

+0

私はただ1つのpythonスクリプトを持っています。 – imkost

+0

@imkost:あなたは 'python run.py 0 1000000'を実行できません。 –

+0

@JoelCornett:これはスクリプトを完了するのに時間がかかります – imkost

関連する問題