我正在用 Java 构建一个框架,它将监听事件,然后在 Jython 中处理它们。不同的事件类型将被发送到不同的脚本。
由于调用 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 行,没有循环。数量和频率是完全随机的(用户生成的事件),每个事件类型可能是每秒 0 到大约 200 个。
最好的方法是什么?我正在研究几种可能性:
- 在触发事件点使用同步 - 这将防止同一脚本的多个实例,但事件也不会像应有的那样快速处理
- 通过克隆原始 PyCode 对象以某种方式填充相同类型的脚本池 - 最大的问题可能是优化池大小
- 在需要时从父对象动态克隆脚本对象,然后在 exec() 完成时将其丢弃 - 这样从编译中删除了滞后,但它仍然存在于克隆方法中
数字 2 和 3 的组合可能是最好的 - 创建动态池大小?
那么,有什么想法吗?;)