我有一段代码:
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
我错过了这些帖子的内容吗?
答案 0 :(得分:0)
此时未加载Tracker::ConfigItem
,因此多个线程开始尝试加载相同的文件。
在当前版本的红宝石中,要求非常危险,并且可能导致各种竞争条件。我坚持了
require_dependency 'tracker/config_item'
上面的文件,以便您确定需要在主线程上发生而不是您的子线程与之抗争