Jruby 线程上下文实例关联
Jruby thread context instance association
我正在尝试在 ruby 中评估 javascript。
config/initializer/initializer_context.rb
js_str =
EXEC_PP_CONTEXT = ExecJS.compile("function test_add(param) { return param.a+ param.b;}")
然后在我的控制器中使用:
data_hash = {:a=>4,:b=>5}
EXEC_PP_CONTEXT.exec("return test_add(#{data_hash.to_json})")
但我偶尔会遇到此错误(100 个请求中有 1 个)
can not use Context instance already associated with some thread
堆栈:
- jruby-1.7.3 ruby 1.9 模式
- 特立尼达服务器 jruby_min_runtimes & jruby_min_runtimes 作为 1
- rails 3.2.13
- rubyrhino 2.0.2
如果我已经将最大运行时间和最小运行时间设置为 1,它不应该首先避免这个问题吗?
通过阅读Mozilla rhino的代码终于弄明白了:
https://github.com/matthieu/rhymeno/blob/master/src/org/mozilla/javascript/Context.java#LC416
static final Context enter(Context cx, ContextFactory factory)
基本上,该方法计算上下文中的线程数(使用它/执行它),如果另一个线程试图进入它,它会抛出一个错误。
为了避免这个问题并实现并发,我们使用 ruby 的 Thread[:current][:some_js_context] = blah_
懒惰地为每个线程创建了一个上下文
我正在尝试在 ruby 中评估 javascript。
config/initializer/initializer_context.rb
js_str =
EXEC_PP_CONTEXT = ExecJS.compile("function test_add(param) { return param.a+ param.b;}")
然后在我的控制器中使用:
data_hash = {:a=>4,:b=>5}
EXEC_PP_CONTEXT.exec("return test_add(#{data_hash.to_json})")
但我偶尔会遇到此错误(100 个请求中有 1 个)
can not use Context instance already associated with some thread
堆栈:
- jruby-1.7.3 ruby 1.9 模式
- 特立尼达服务器 jruby_min_runtimes & jruby_min_runtimes 作为 1
- rails 3.2.13
- rubyrhino 2.0.2
如果我已经将最大运行时间和最小运行时间设置为 1,它不应该首先避免这个问题吗?
通过阅读Mozilla rhino的代码终于弄明白了: https://github.com/matthieu/rhymeno/blob/master/src/org/mozilla/javascript/Context.java#LC416
static final Context enter(Context cx, ContextFactory factory)
基本上,该方法计算上下文中的线程数(使用它/执行它),如果另一个线程试图进入它,它会抛出一个错误。
为了避免这个问题并实现并发,我们使用 ruby 的 Thread[:current][:some_js_context] = blah_