Ruby Thread.new对类调用做了奇怪的事情

时间:2012-01-12 16:21:08

标签: ruby-on-rails ruby

我有一段代码:

config_item_relation = OTRS::Relation.new
config_item_threads = []
config_items.each do |ci|
  config_item_threads << Thread.new do
    config_item_relation << Tracker::ConfigItem.object_preprocessor(ci.first)
  end
end

导致此错误:

LoadError: Expected app/models/tracker/config_item.rb to define Tracker::ConfigItem

如果我将线程创建注释掉:

config_item_relation = self.superclass::Relation.new
config_item_threads = []
config_items.each do |ci|
  #config_item_threads << Thread.new do
    config_item_relation << Tracker::ConfigItem.object_preprocessor(ci.first)
  #end
end

代码运行得很好,当然它不会在单独的线程中执行。 错误中引用的文件确实定义了Tracker :: ConfigItem。 class Tracker::ConfigItem < OTRS::ConfigItem 这是我在其他地方使用很多地方的课程没有问题,直到我在这里使用Thread。 我对相同的代码块中的一个不同但非常相似的类(相同的继承)具有相同的线程使用,它完全正常工作:

ticket_threads = []
if tickets
  ticket_relation = self.superclass::Relation.new
  tickets.each do |t|
    ticket_threads << Thread.new do
      ticket_relation << Tracker::Ticket.object_preprocessor(t)
    end
  end
end

我错过了这些帖子的内容吗?

1 个答案:

答案 0 :(得分:0)

此时未加载Tracker::ConfigItem,因此多个线程开始尝试加载相同的文件。

在当前版本的红宝石中,要求非常危险,并且可能导致各种竞争条件。我坚持了

require_dependency 'tracker/config_item'

上面的文件,以便您确定需要在主线程上发生而不是您的子线程与之抗争