私のコードは Python 2.7 でマルチスレッドを使用しています。私のローカル マシン (i コア 3 RAM 4GB) 上の同じプログラムは、1 分 10 秒で約 1000 件の送信を評価します。しかし、ec2 マイクロ インスタンス (約 600 MB RAM) で実行すると、約 40 分かかります (ランダムな秒数で遅くなります)。
まず、これは私のエバリュエーターの仕組みです:
worker.py
複数のスレッドを作成するメインプログラムがあります- メイン スレッドは、(当面の間) ファイルから送信を (一度に 10 件) プルし、それらをグローバル キューに入れます。
- サイド スレッドはキューから送信を受け取ります (1 つの送信は 1 つのスレッドによってのみ評価されます)。
- サイドスレッドが送信を受け取った後、それを関数に送信します。関数は、送信
compile
の実行可能ファイルをそのスレッドに返します。 - 次に、スレッドはこの実行可能ファイルを関数に送信します。関数
run
は実行可能ファイルを実行し (メモリと時間制限が定義されたサンドボックスを使用)、実行可能ファイルの出力をファイルに書き込み、
標準出力と照合します。 - キューが空になると、メイン スレッドは再び 10 件の送信を取得し、それらをキューに入れます。
関数
compile
とrun
:- compile 関数と run 関数は、実行可能ファイルと出力をファイル (それぞれ) のような名前で保存する
<thread_Name>.exe
ため<thread_Name>.txt
、すべてのスレッドに独自のファイルがあり、上書きの問題はありません。 - スレッドは、コンパイル関数からのステータスが OK (コンパイルされたファイル) である場合にのみ関数を実行します。それ以外の場合、その送信に対してコンパイル エラーがスローされます。
- compile 関数と run 関数は、実行可能ファイルと出力をファイル (それぞれ) のような名前で保存する
今私が持っている疑問:
- ec2のリソースが原因で、またはpythonのマルチスレッド化が原因で、ec2での実行が遅いという問題があります
test.py(I dont put lock on it)
。文字ごとの標準出力(vimdiffのような)、およびmysandbox.py(libsandbox the sandbox)
その他のいくつかのグローバル変数.PythonのGILが原因で動作が遅い.そうであれば、ローカルマシンで高速に動作するのはなぜですか. - また、当分の間、同じファイルを
test.cpp(adds two numbers and prints result)
1000回与えます。そのため、このファイルで意図的にコンパイルエラーを作成し、ec2でメインプログラムを実行すると、かなり高速に実行されます。 )スレッドの作成と管理ではなく、私のプログラムの主な時間がかかります。
- ec2のリソースが原因で、またはpythonのマルチスレッド化が原因で、ec2での実行が遅いという問題があります
私はそれが膨大な質問であることを知っていますが、どんな助けも本当に感謝しています(または、私の評判をすべて賭けて賞金を稼がなければなりません:))。