将Ruby的线程哈希/上下文传递给另一个线程

时间:2012-11-15 05:49:35

标签: ruby multithreading ruby-on-rails-3.2

有没有办法将Thread的上下文(基本上是Thread.current哈希)传递给另一个线程。

我正在从现有线程做Thread.new,我希望这个新线程可以访问当前(即调用线程)的哈希值。

这是在ruby MRI 1.9.3 / Rails 3.2.8环境中。

2 个答案:

答案 0 :(得分:0)

Thread.new do
  $binding = binding
  msg = "Message from another thread"
end.join

Thread.new($binding){|b| eval("p msg", b)}.join
# => "Message from another thread"

答案 1 :(得分:0)

如果您需要传递光纤局部值,请使用:

Thread.current[:foo] = 'bar'
Thread.new(Thread.current) do |parent_context|
  parent_context.keys.each do |k|
    Thread.current[k] = parent_context[k]
  end

  puts Thread.current[:foo]
end.join

但是对于线程局部值,您应该使用Thread#thread_variable_setThread#thread_variable_get

Thread.current.thread_variable_set(:foo, 'bar')
Thread.new((Thread.current)) do |parent_context|
  puts parent_context.thread_variable_get(:foo)
end.join

Check out docs表示光纤和线程本地值之间的差异