Jruby 线程上下文实例关联

Posted

技术标签:

【中文标题】Jruby 线程上下文实例关联【英文标题】:Jruby thread context instance association 【发布时间】:2015-04-21 17:34:24 【问题描述】:

我正在尝试在 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

堆栈:

ruby 1.9 模式下的 jruby-1.7.3 trinidad 服务器,jruby_min_runtimes & jruby_min_runtimes 为 1 导轨 3.2.13 therubyrhino 2.0.2

如果我已经将最大运行时间和最小运行时间设置为 1,它不应该首先避免这个问题吗?

【问题讨论】:

它可能来自 Rhino 本身而不是 JRuby - 每个线程也使用上下文来管理状态...... 【参考方案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_ 懒惰地为每个线程创建了一个上下文

【讨论】:

既然你已经自己回答了,你还应该更改标题以更好地反映这个 q 的含义......

以上是关于Jruby 线程上下文实例关联的主要内容,如果未能解决你的问题,请参考以下文章

ThreadLocal

java ThreadLocal

ThreadLocal源码解析

ThreadLocal详细解答

ThreadLocal详细解答

获取 NSManagedObject 实例的上下文是不是是线程安全的?