2012-08-14 10 views
8

私は、os.subprocessモジュールを使用していくつかの外部コマンドを実行するpythonスクリプトを持っています。しかし、これらのステップの1つには膨大な時間がかかりますので、別々に実行したいと思います。私はそれらを起動し、それらが終了していることを確認し、次に平行でない次のコマンドを実行する必要があります。あなたがスレッドを使用してそれを行うことができますPythonで並列プログラムを実行する方法

nproc = 24 
for i in xrange(nproc): 
    #Run program in parallel 

#Combine files generated by the parallel step 
for i in xrange(nproc): 
    handle = open('Niben_%s_structures' % (zfile_name), 'w') 
    for i in xrange(nproc): 
     for zline in open('Niben_%s_file%d_structures' % (zfile_name,i)):handle.write(zline) 
    handle.close() 

#Run next step 
cmd = 'bowtie-build -f Niben_%s_precursors.fa bowtie-index/Niben_%s_precursors' % (zfile_name,zfile_name) 

答えて

0

: 私のコードは次のようなものです。これは非常に短く、(テストしていない)の例は非常に醜いであれば、そうでないあなたが実際にスレッドでやっていることに、しかし、あなたは労働者のクラスを所有して書くことができます。..

import threading 

class Worker(threading.Thread): 
    def __init__(self, i): 
     self._i = i 
     super(threading.Thread,self).__init__() 

    def run(self): 
     if self._i == 1: 
      self.result = do_this() 
     elif self._i == 2: 
      self.result = do_that() 

threads = [] 
nproc = 24 
for i in xrange(nproc): 
    #Run program in parallel   
    w = Worker(i) 
    threads.append(w) 
    w.start() 
    w.join() 

# ...now all threads are done 

#Combine files generated by the parallel step 
for i in xrange(nproc): 
    handle = open('Niben_%s_structures' % (zfile_name), 'w') 
    ...etc... 
+0

これはスレッドが終了するまで、 'join()'ブロッキング(他のスレッドの開始を妨げる)のために、実際には何もしません。これを回避する方法は私の答えを見てください。 – pR0Ps

2

並行して物事を実行することも可能Pythonで複数のプロセスを使用して実装されています。私は基本的に、アイデアは独立して、キューからジョブを取得し、「ワーカープロセス」を使用して、これらのジョブを完了することですあなたがここに

http://multicodecjukebox.blogspot.de/2010/11/parallelizing-multiprocessing-commands.html

それを見つけることができ、しばらく前にこのトピックに関するブログ記事を書いていました。

私の経験ではかなりうまく動作します。

6

あなたの例では、パラレルにシェルしたいだけです。スレッドにはスレッドは必要ありません。

subprocessモジュールでPopenコンストラクタを使用します。http://docs.python.org/library/subprocess.htm

は、あなたが生成された各プロセスのPopenインスタンスを収集し、それらが終了するのをwait()

procs = [] 
for i in xrange(nproc): 
    procs.append(subprocess.Popen(ARGS_GO_HERE)) #Run program in parallel 
for p in procs: 
    p.wait() 

あなたはこれで逃げることができます(とmultiprocessingまたはthreadingモジュールを使用するのではなく)、これらの相互運用性を持つことに本当に関心があるわけではないので、osにそれらを並行して実行させ、結果を結合するために行く...

+0

+1何らかの理由で私は質問を読んでいる間にその詳細を忘れてしまった。これは間違いなく外部コマンドを実行するための方法です。 – pR0Ps

+0

これは完璧です。正確に私が探していたもので、他の答えよりずっとシンプルです。スレッドの例は他のものにも非常に役立ちますが、どうもありがとうございます – user1598231

+0

@Daren Thomas:どうすれば各プロセスの結果を得たいですか? – hguser