私はJavaでイベントをリッスンし、Jythonで処理するフレームワークを構築しています。異なるイベントタイプが異なるスクリプトに送信されます。Javaから実行するマルチスレッドのjythonスクリプト
PythonInterpreter.exec()が呼び出されたときにjythonがスクリプトをコンパイルするのにかなり時間がかかるので、スクリプトをあらかじめコンパイルする必要があります。複数があることが起こるかもしれない - イベントは私の難問のための今すぐ
PythonInterpreter pi = new PythonInterpreter();
pi.set("variable_1", "value_1");
pi.set("variable_x", "value_x");
pi.exec(compiled);
に来るようPyCodeコンパイルされたオブジェクトがリポジトリにプッシュして使用される
// 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");
:私はそれを次のようにやっています特定のタイプのイベントが同時に発生するため、複数のスクリプトインスタンスが同時に実行されます。
ほとんどすべてのスクリプトは、おそらく短命のままです - 最大100行、ループなし。番号と頻度は完全にランダム(ユーザーが生成したイベント)で、イベントの種類ごとに1秒あたり約0〜約200になります。
これを行うにはどうすればよいでしょうか?私はいくつかの可能性を見ています:トリガーイベントポイントで
- 使用同期 - これは、同じスクリプトの複数のインスタンスを妨げるだけでなく、イベントは、彼らが
- は、プールを作成する必要があります限り迅速に処理されません最大の問題はおそらくプールのサイズを最適化することでしょう。
- 必要に応じていつでも親からスクリプトオブジェクトを動的に複製してから、exec()が終了するとそのオブジェクトを破棄して、遅延を取り除きますコンパイルからはまだクローンメソッドに存在する
おそらく番号2と3の組み合わせが最適な動的プールサイズを作成するでしょうか?
だから、どんな考えですか? ;)
ニース!最初のModule.compile(...)が呼び出される前に、PythonInterpreterのインスタンスを作成しなければならないことに注意してください。そうでない場合は、SyspathJavaLoaderからNullPointerExceptionがスローされます。loadClass() あなたは最も役に立ちました。今私がしなければならないのは、これを動的にサイズ変更可能なスクリプトのプールに統合することです。 – nEJC
Jython 2.5の同等の機能はどれですか? – Laurent
@Laurentは - 私はこの答え興味深い – McDowell