【问题标题】:How to avoid race conditions when setting class variables on each request in Ruby on Rails在 Ruby on Rails 中为每个请求设置类变量时如何避免竞争条件
【发布时间】:2012-03-18 22:15:30
【问题描述】:

我有一个像模型这样的活动资源,它与一个安静的资源进行通信。 资源路径有一些动态参数,所以我在每次请求之前在模型上设置一些类变量。

我有这样的事情:

class MyClass << MySuperClass::Base

  class << self
    attr_accessor :site
    attr_accessor :shop_id
    attr_accessor :product_id

    def get
      RestClient.get(self.site)
    end

    def set_site(shop_id, product_id)
      self.site = "http://example.com/api/shop/#{shop_id}/product/#{product_id}
    end
  end
end

在我的应用程序控制器中,我有一个设置 shop_id 和 product_id 的前置过滤器

class ApplicationController < ActionController::Base
  before_filter :set_site

  private

  def set_site
    MyClass.set_site(current_shop.id, current_product.id)
  end
end

据我了解:http://m.onkey.org/thread-safety-for-your-rails 这可能是某些竞争条件的原因。

那篇文章是 3 年前写的,所以仍然存在为每个请求设置类变量可能导致竞争条件的情况?

如果是这样,那么在不引发竞争条件的情况下实现类似行为的当前最佳做法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 race-condition class-variables


    【解决方案1】:

    question 的答案是:“标准的 Rails 应用程序是单线程的。”查看详情。

    【讨论】:

      【解决方案2】:

      不要为不同请求设置不同值的类设置类变量。

      Rails 将在请求之间保留类变量,您将无法保证数据不会在两个不同用户的会话之间泄漏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-12
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多