【发布时间】:2010-11-18 15:40:14
【问题描述】:
我正在用 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 的组合可能是最好的 - 创建动态池大小?
那么,有什么想法吗? ;)
【问题讨论】:
标签: java multithreading thread-safety jython