subprocess.Popen() を使用してコマンドラインから実行されるプログラムで回帰テストを実行するための Python スクリプト (cygwin および Linux 環境用) を作成しています。基本的に、開発者のニーズに応じて (10 から 1000 のオーダーで) 実行する必要があるジョブのサブセットがあります。各ジョブは、完了するまでに数秒から 20 分かかります。
複数のプロセッサでジョブを正常に実行していますが、(過去のパフォーマンスに基づいて) ジョブをインテリジェントに並べ替えて、より長いジョブを最初に実行することで、時間を節約しようとしています。複雑なのは、一部のジョブ (定常状態の計算) を他のジョブ (定常状態によって決定される初期条件に基づく過渡) の前に実行する必要があることです。
これを処理する私の現在の方法は、親ジョブとすべての子ジョブを同じプロセスで再帰的に実行することですが、一部のジョブには複数の長時間実行される子があります。親ジョブが完了したら、子をプールに追加して他のプロセスにファームアウトしたいのですが、キューの先頭に追加する必要があります。multiprocessing.Pool でこれを実行できるかどうかはわかりません。Manager で例を探しましたが、それらはすべてネットワーキングに基づいているようで、特に適用できるものではありません。マルチプロセッシングに関する優れたチュートリアルへのコードまたはリンクの形式でのヘルプ(私はグーグルで検索しました...)をいただければ幸いです。これは、これまでに得たコードのスケルトンであり、他のプロセッサで生成したい子ジョブを指摘するためにコメントされています。
import multiprocessing
import subprocess
class Job(object):
def __init__(self, popenArgs, runTime, children)
self.popenArgs = popenArgs #list to be fed to popen
self.runTime = runTime #Approximate runTime for the job
self.children = children #Jobs that require this job to run first
def runJob(job):
subprocess.Popen(job.popenArgs).wait()
####################################################
#I want to remove this, and instead kick these back to the pool
for j in job.children:
runJob(j)
####################################################
def main(jobs):
# This jobs argument contains only jobs which are ready to be run
# ie no children, only parent-less jobs
jobs.sort(key=lambda job: job.runTime, reverse=True)
multiprocessing.Pool(4).map(runJob, jobs)