1

私のコードは Python 2.7 でマルチスレッドを使用しています。私のローカル マシン (i コア 3 RAM 4GB) 上の同じプログラムは、1 分 10 秒で約 1000 件の送信を評価します。しかし、ec2 マイクロ インスタンス (約 600 MB RAM) で実行すると、約 40 分かかります (ランダムな秒数で遅くなります)。

  1. まず、これは私のエバリュエーターの仕組みです:

    • worker.py複数のスレッドを作成するメインプログラムがあります
    • メイン スレッドは、(当面の間) ファイルから送信を (一度に 10 件) プルし、それらをグローバル キューに入れます。
    • サイド スレッドはキューから送信を受け取ります (1 つの送信は 1 つのスレッドによってのみ評価されます)。
    • サイドスレッドが送信を受け取った後、それを関数に送信します。関数は、送信compileの実行可能ファイルをそのスレッドに返します。
    • 次に、スレッドはこの実行可能ファイルを関数に送信します。関数runは実行可能ファイルを実行し (メモリと時間制限が定義されたサンドボックスを使用)、実行可能ファイルの出力をファイルに書き込み、
      標準出力と照合します。
    • キューが空になると、メイン スレッドは再び 10 件の送信を取得し、それらをキューに入れます。

  2. 関数compilerun:

    • compile 関数と run 関数は、実行可能ファイルと出力をファイル (それぞれ) のような名前で保存する<thread_Name>.exeため<thread_Name>.txt、すべてのスレッドに独自のファイルがあり、上書きの問題はありません。
    • スレッドは、コンパイル関数からのステータスが OK (コンパイルされたファイル) である場合にのみ関数を実行します。それ以外の場合、その送信に対してコンパイル エラーがスローされます。

  3. 今私が持っている疑問:

    • 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でメインプログラムを実行すると、かなり高速に実行されます。 )スレッドの作成と管理ではなく、私のプログラムの主な時間がかかります。

私はそれが膨大な質問であることを知っていますが、どんな助けも本当に感謝しています(または、私の評判をすべて賭けて賞金を稼がなければなりません:))。

4

1 に答える 1