我有一个关于我遇到的问题的问题。我正在尝试实现一个对象(单例)/线程,但是我遇到了一个我没有预料到的行为。
例如,我们有以下代码
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,然后一切都按预期工作。
我有点困惑为什么会发生这种行为。希望你能理解我的问题。
谢谢!
发布于 2019-02-13 17:41:05
Rails,为每个请求创建一个新的Controller实例,而不是一个线程。我找到的最好的解决方案是:https://github.com/steveklabnik/request_store
https://stackoverflow.com/questions/54651928
复制相似问题