Rails:请求范围数据共享的Thread.Current哈希

时间:2012-05-08 02:55:32

标签: ruby-on-rails ruby ruby-on-rails-3

我打算在ruby中使用Thread.Current哈希来在我的Rails应用程序中为每个请求范围共享信息。 (我知道这可能不是最好的设计决定,甚至可能打破MVC)。 我正在研究这里提到的方法http://coderrr.wordpress.com/2008/04/10/lets-stop-polluting-the-threadcurrent-hash/

这基本上为类添加了thread_local_accessor方法,并在给定线程超出范围时提供扫描。有谁知道这是否有任何其他限制或我应该注意的任何问题?或者任何其他请求级别哈希更干净的替代方法?

1 个答案:

答案 0 :(得分:0)

您链接的代码不是线程安全的。它使用ruby的Hash类,它不是线程安全的。您可以使用ruby的同步原语之一来保护访问,例如:互斥。

另外,我不相信使用由线程id索引的全局数据结构比使用Thread.current更好。

如果您担心密钥冲突,为什么不选择一个唯一的密钥,比如GUID。基于您提供的链接中的示例:

class ThreadedLibrary
  @@LIBRARY_ID = 'D0052660-60E6-4624-B08E-ECA9200B2949'
  Thread.current[@@LIBRARY_ID] = {}

  def self.some_setting= val
    Thread.current[@@LIBRARY_ID][:some_setting] = val
  end

  def self.some_setting
    Thread.current[@@LIBRARY_ID][:some_setting] ||= :default
  end
end