【问题标题】:Rails Engine Thread Safety - ActiveResourceRails 引擎线程安全 - ActiveResource
【发布时间】:2012-09-18 20:08:44
【问题描述】:

我的 Rails 3.1 应用程序使用了一个引擎,我想知道对该引擎的访问是否是线程安全的。

我在引擎中有 /lib/mymodule.rb,它看起来像这样:

module MyModule
  def self.my_method()
    begin
       data = WebResource.find(:all) # Where WebResource < ActiveResource::Base
    rescue
       data = nil
    end

    return data
  end
end

然后在我的视图/控制器中,我这样调用这个方法:

MyModule::WebResource.headers[:some_id] = cookies[:some_id]
MyModule::my_method()

在我的主应用程序中,我有线程安全!配置选项集。我知道线程安全!启用后,每个控制器针对每个请求都存在于它自己的线程中。

但是,这个模块是线程安全的吗?我怀疑这个模块对于所有请求只有一个副本,所以它不是本质上是线程安全的,并且需要使用 Mutex 之类的手动同步。具体来说,我有代码为 ActiveResource 类 WebResource 的 HTTP 请求 outside 设置标头。这会导致线程问题吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 thread-safety rails-engines


    【解决方案1】:

    这取决于你在这个方法中做了什么,它是否是线程安全的。如果它不接触类变量,那么它是线程安全的。

    如果它在类级别存储或设置信息,并假定在再次使用该信息之前没有其他方法会接触该信息,那么它不是线程安全的。

    【讨论】:

    • 谢谢@Jesse。我已经更新了我的问题以提供更多详细信息。虽然我没有触及任何类变量/全局状态,但我仍然不确定这是否可行。我在我的控制器中在引擎之外设置 HTTP 标头信息。你知道是否每个 Rails 请求都会获得它自己的 Engine/WebResource.headers 实例吗?
    • MyModule::WebResource.headers 是如何在 Ruby/Rails 中实现的?是班级级别的吗?
    • 什么是 WebResource ?那不是你定义的 activerecord 类吗?
    • 它是 ActiveResource 的子类,而不是 ActiveRecord。我想知道我是否在控制器中设置了MyModule::WebResource.headers,它是否只在该控制器中更改,还是针对所有控制器/请求?也就是说,是否每个控制器都有一个 WebResource 实例,或者引擎只有一个,并且所有控制器都使用相同的引用。
    • 啊,活动资源!我建议编辑您的问题以指定询问 ActiveResource。不,这不是线程安全的......这是一种使用它的方法:stackoverflow.com/questions/8088126/…
    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多