我有以下模型:
class User < ActiveRecord::Base
def send_message(content)
MessagePoro.new(content).deliver!
end
def self.send_to_all(content)
threads = []
all.each do |user|
threads << Thread.new do
user.send_message(content)
end
end
threads.each(&:join)
end
end
消息Poro(Plain Old Ruby Object)模型可以是一些简单的东西,例如 app/models/message_poro.rb:
class MessagePoro
def initialize(content)
# ...
end
def deliver!
# ...
end
end
现在,当我有例如100个用户,并且我运行User.send_to_all("test")时,有时会出现以下错误:
RuntimeError: Circular dependency detected while autoloading constant MessagePoro
或:
wrong number of arguments (1 for 0)
我想这可能是因为MessagePoro没有加载,所有线程都尝试同时加载它,或者类似于这样的情况。由于这些错误只会偶尔发生,我相信只有在存在“竞态条件”或与线程有关的情况下才会出现。我已经尝试在启动线程之前初始化MessagePoro,并尝试过渴望加载,但问题似乎仍然存在。 还有什么其他方法可以缓解这个问题?