我有以下型號:的Rails 4.2自動加載不是線程安全
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
MessagePoro模型可以是簡單的東西,例如app/models/message_poro.rb:
class MessagePoro
def initialize(content)
# ...
end
def deliver!
# ...
end
end
現在,當我有例如100個用戶,並且我跑User.send_to_all( 「測試」),我有時得到錯誤thoser:
RuntimeError: Circular dependency detected while autoloading constant MessagePoro
或:
wrong number of arguments (1 for 0)
我想這一定是因爲MessagePoro ISN不會加載,所有線程都會嘗試同時加載它,或類似的東西。由於這些錯誤有時只會發生,所以我非常確定只有在出現「競爭條件」或與Threading有關的情況時纔會這樣做。我已經嘗試在啓動線程之前初始化MessagePoro,並且已經玩過eager_loading,但問題似乎仍然存在。 我還可以嘗試緩解這個問題嗎?
嘗試在自動加載前手動要求 – 2015-04-04 16:52:01
請您詳細說明一下嗎?就像在線程啓動之前調用MessagePoro.new一樣? 如果這是修復它,我仍然好奇底層問題 – 2015-04-04 16:53:27
沒有。目前您擁有基本的Rails自動加載設置。如果您在代碼中首先調用MessagePoro,那麼它會根據一些約定(例如,MyModule :: MessagePoro應該在autoload_path/my_module/message_poro.rb中)要求它。但是你可以嘗試手動要求'path/to/message_poro'。 – 2015-04-04 16:57:11