私は正確なランタイムを得るために、同時に1つのマシン上で2つのサブプロセスを実行することを検討していました。私はソフトウェアの2つのバージョンを比較しており、ランタイム、出力のばらつきなどの診断を実行しています。2つのpythonサブプロセスを実行し、ランタイムとstdoutを取得するにはどうすればいいですか?
元は同じ入力ファイルで両方のバージョンのソフトウェアを使用し、場所。古いバージョンと新しいバージョンは、argparserを通して取得されます。関数は各ソフトウェアコマンドにサブプロセスを使用し、出力は.communicate()によって取得されます。しかし、私が知っていることは、.communicate()はプロセスが終了するのを待っています。理想的には同時に両方のプロセスで.communicate()を使用して、同時に開始し、タイムアウトしたいのです。私が彼らのランタイムを知っている限り。
私の質問は、より簡潔には、それぞれが個別に実行され、同時に開始する2つのサブプロセスを実行する方法です。そして、彼らのランタイムとstdout、stderrをつかむ?
私の機能の相続人は簡単な例(ほんの一部のファイルでJavaのIM検査速度をふり):
def test():
# Get start time
before = time.time()
cmd1 = ['java-1.0', 'blah']
c1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
cmd2 = ['java-1.5', 'blah']
c2 = subprocess.Popen(cmd2, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# Start both processes at the same time??
results = [c1.communicate(), c2.communicate()]
# Get total time taken
total = round(time.time()-before, 2)
# Print out the total time (I know its messy but its accurate)
print "%s:%s:%s" % (int(total/60/60), int(total/60), int(total))
c1.stderr.close()
c2.stderr.close()
return results
私がしたいもう一つのポイントが原因であれば、私は同時に実行するためにそれらを必要とするということです私は強力なリモートマシン上で仕事をしています(私はそうです)。そして、ジョブが実行されている間にワークロードを同じにして、別の時間に実行されたために1つのプロセスが速く終了しないようにします。
よりもむしろふりを呼び出して、私達と直接的です。 2つの外部プログラムの速度を実際にテストしている場合、最良のアプローチは、単に実行する必要がある場合とは大きく異なります(ここで書いたものとはまったく異なります)。達成したいことをより詳細に共有してください。 –
あなたのここでのラウンドの使用は理想的ではありません(実際には、ラウンドはまったく役に立ちません)。秒数を四捨五入したい場合は、 '%0.2f'フォーマット指定子などを使用してください。 –
ラウンドのような組み込み関数が完全に無関係であることはわかりませんでしたが、それは実際に私の問題を解決することとは関係ありません。とにかく、もっと直接的なことは何を意味しますか?私は何かふりをするつもりはありません。はい、同じデータで2つの異なるバージョンのソフトウェアをテストし、その出力とスピードを比較したいと思います。具体的には、私はピカードの異なるバージョンをテストしています。新しいバージョンはおそらく最大5倍高速ですので、私はこれをテストしたいだけでなく、両方のバージョンが同じ結果をもたらすことを確認したいと思います! –