イベントをリッスンしてからJythonで処理するフレームワークをJavaで構築しています。さまざまなイベント タイプがさまざまなスクリプトに送信されます。
PythonInterpreter.exec() が呼び出されると、jython はスクリプトをコンパイルするのにかなりの時間がかかるため、スクリプトをプリコンパイルする必要があります。私は次の方法でそれをやっています:
// initialize the script as string (would load it from file in final version)
String script = "print 'foo'";
// get the compiled code object
PyCode compiled = org.python.core.__builtin__.compile( script, "<>", "exec" );
PyCode でコンパイルされたオブジェクトはリポジトリにプッシュされ、イベントが受信されると使用されます。
PythonInterpreter pi = new PythonInterpreter();
pi.set( "variable_1", "value_1");
pi.set( "variable_x", "value_x");
pi.exec( compiled );
ここで、私の難問について説明します。特定のタイプの複数のイベントが同時に発生する可能性があります。したがって、スクリプトの複数のインスタンスが同時に実行されます。
ほとんどすべてのスクリプトはおそらく短命のままで、最大 100 行、ループはありません。数と頻度は完全にランダム (ユーザー生成イベント) で、イベント タイプごとに 1 秒あたり 0 から約 200 になる可能性があります。
それを行う最善の方法は何ですか?私はいくつかの可能性を見ています:
- トリガーイベントポイントで同期を使用します-これにより、同じスクリプトの複数のインスタンスが防止されますが、イベントは本来の速度で処理されません
- 元の PyCode オブジェクトのクローンを作成することによって何らかの方法で入力された同じタイプのスクリプトのプールを作成します。おそらく最大の問題は、プール サイズの最適化です。
- 必要に応じて親からスクリプト オブジェクトを動的に複製し、exec() が終了したら破棄します。このようにして、コンパイルからラグが取り除かれますが、クローン メソッドにはまだ存在します。
おそらく 2 番と 3 番の組み合わせが最適でしょう - 動的プール サイズを作成しますか?
それで、何か考えはありますか?;)