代码之家  ›  专栏  ›  技术社区  ›  Rares R

每个线程的“Singleton”

  •  1
  • Rares R  · 技术社区  · 6 年前

    我有一个关于我遇到的问题的问题。我试图实现一个对象(singleton)/thread,但是遇到了一个出乎意料的行为。

    例如,我们有以下代码

    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)

    那我们就去吧 Persistence.instance.get_data

    但是让我们假设在5分钟内,一个用户发出了同样的请求。我发现 Persistence.instance.get_data(2) Persistence.instance.get_数据(一)

    rails不为每个请求创建一个新线程,这样就不会发生上述情况了?

    我发现的唯一解决方案是在applicationcontroller中添加一个before\u过滤器 Persistence.clear

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

    1 回复  |  直到 6 年前
        1
  •  0
  •   Rares R    6 年前

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