私は別のコンフィギュレーションで呼び出したいバイナリ(たとえば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コードで間違っていたものは何ですか?
all_configsにはいくつの設定がありますか? – JoshRagem
オリジナルの質問で言ったように、@ JoshRagemは40以上の数です。 – CodeNoob
a.outに著しい遅延を加えようとします。 – alexander