首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个线程‘'Singleton’

每个线程‘'Singleton’
EN

Stack Overflow用户
提问于 2019-02-12 22:09:04
回答 1查看 93关注 0票数 1

我有一个关于我遇到的问题的问题。我正在尝试实现一个对象(单例)/线程,但是我遇到了一个我没有预料到的行为。

例如,我们有以下代码

代码语言:javascript
复制
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,然后一切都按预期工作。

我有点困惑为什么会发生这种行为。希望你能理解我的问题。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-13 17:41:05

Rails,为每个请求创建一个新的Controller实例,而不是一个线程。我找到的最好的解决方案是:https://github.com/steveklabnik/request_store

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54651928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档