每个线程“单个”

时间:2019-02-12 14:09:04

标签: ruby-on-rails ruby multithreading

我对遇到的问题有疑问。我正在尝试实现一个对象(单例)/线程,但是遇到了意外的行为。

例如,我们有以下代码

class Persistence

  attr_accessor :data

  def self.instance
    Thread.current[:persistence_store] ||= Persistence.new
  end

  def self.clear
    Thread.current[:persistence_store] = nil
  end

  def get_data(user_id = nil)
    self.data ||= AnotherClass.get_advanced_data(user_id)
  end

end

可以说有一个请求传入,并且控制器中有Persistence.instance.get_data(1)(因此get_data仅执行一次)。

然后,我们再次在模型中进行Persistence.instance.get_data,所有操作都可以按预期的方式从初始请求中加载数据。

但是可以说,用户在5分钟内执行了相同的请求。我发现保存在Persistence.instance.get_data(2)中的值是来自第一个用户请求的值。 (实际上是Persistence.instance.get_data(1))。

rails是否会为每个请求创建一个新线程,以防止上述情况发生?

我发现的唯一解决方案是在执行Persistence.clear的应用程序控制器中添加一个before_filter,然后所有操作都按预期进行。

我有点困惑为什么会出现这种现象。希望你理解我的问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

根据请求(而不是线程)滚动,创建Controller的新实例。我发现最好的解决方案是:https://github.com/steveklabnik/request_store