2012-03-28 7 views
4

私は別のコンフィギュレーションで呼び出したいバイナリ(たとえばa.out)を持っています。 40コアマシンでこれらのconfigを並行して実行したい。以下は私のコードのスケッチです。Pythonマルチプロセッシング+サブプロセスの問題

私はconfigを生成してワーカーに渡し、ワーカーはサブプロセスを使ってconfigを使ってバイナリを呼び出します。出力をファイルにリダイレクトしています。コードrun.py

def worker(cmdlist, filename): 
    outputfile = open(filename, 'wb') 
    // here it essentially executes a.out config > outputfile 
    subprocess.call(cmdlist, stderr=outputfile, stdout=outputfile) 
    outputfile.close() 

def main(): 
    pool = Pool(processes = 40) 
    for config in all_configs 
     filename, cmdlist = genCmd(config) 
     res = pool.apply_async(worker, [cmdlist, filename]) 
     results.append(res) 
    for res in results: 
     res.get() 
    pool.close() 

のこの作品を呼びましょう。しかし、私はそれをキックオフした後、私は私が好きな私はできるだけ多くのプロセスを産卵わけではないことに気づきました。私は間違いなく40人以上の労働者を提出しましたが、一番上には約20人のa.outしか見ていません。

"スリーピング"状態(つまり、一番上の "S")にある多くのrun.pyがあります。 ps aufを実行すると、バイナリが生成されずに "S +"状態のrun.pyが多数表示されました。それらの約半分だけが "a.out"を生み出しました

私は、なぜこれが起こっているのでしょうか?私はアウトプットをネットワークに接続されたハードドライブにリダイレクトしていますが、それは理由ですが、上には10%waしか表示されません(私の理解ではIOを待っている時間の10%です)。私はこれがアイドル状態のCPUの50%になるとは思わない。さらに、少なくともバイナリは、run.pyに詰め込まれているのではなく、少なくとも取り除かれているはずです。バイナリのランタイムも十分です。私は本当に40の仕事が長い間走っているのを見ているべきです。

他の説明はありますか?私のPythonコードで間違っていたものは何ですか?

+1

all_configsにはいくつの設定がありますか? – JoshRagem

+0

オリジナルの質問で言ったように、@ JoshRagemは40以上の数です。 – CodeNoob

+0

a.outに著しい遅延を加えようとします。 – alexander

答えて

1

複数のコアで同時に実行される多くの同時プロセスを使用するために使用した手法は、p = subprocess.Popen(...)とp.Poll()を使用することです。あなたの場合、私はあなたがPoolを完全に使用することをスキップできると思います。私はあなたに良い例を与えたいと思いますが、残念ながら私はもうそのコードにアクセスすることはできません。