9

os.subprocess モジュールを使用していくつかの外部コマンドを実行する Python スクリプトがあります。しかし、これらのステップの 1 つは非常に時間がかかるため、個別に実行したいと考えています。それらを起動し、それらが終了したことを確認してから、並列ではない次のコマンドを実行する必要があります。私のコードは次のようなものです:

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)
4

3 に答える 3

6

あなたの例では、並列でシェルアウトしたいだけです-そのためのスレッドは必要ありません。

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

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にそれらを並行して実行させ、結合するときにすべてが終了していることを確認するだけです結果...

于 2012-08-14T14:45:30.463 に答える
2

Python では、複数のプロセスを使用して並行して実行することもできます。少し前にこのトピックに関するブログ投稿を書いたので、ここで見つけることができます

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

基本的には、キューから個別にジョブを取得し、これらのジョブを完了する「ワーカー プロセス」を使用するという考え方です。

私の経験では非常にうまく機能します。

于 2012-08-14T14:38:18.457 に答える
1

スレッドを使用してそれを行うことができます。これは非常に短い (テストされていない) 例であり、スレッドで実際に行っていることについて非常に醜い if-else を使用していますが、独自のワーカー クラスを作成することもできます。

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...
于 2012-08-14T14:29:27.363 に答える