运行此
时出现此错误LoadError: Expected /home/user/Desktop/Tripurari/myapp/app/models/host.rb to define Host##
但是每件事都在它的位置。有人可以告诉我方法下面的确切问题是什么。
def self.check_all(keyword)
memo_mutex = Mutex.new
memo = {}
threads = []
name = keyword.keyword
SITES.each do |site_and_options|
threads << Thread.new do
@host = Host.find_or_create_by_name(site)
if keyword.unavailable_usernames.find_by_host_id(@host.id)
memo[@host.name] = true
else
memo[@host.name] = false
end
end
end
threads.each { |t| t.join }
memo
end
答案 0 :(得分:6)
问题可能是由自动加载器引起的。如果在第一次进入创建几个新线程的循环时尚未加载Host
类,则会自动加载,即Rails在加载路径中搜索与命名约定匹配的文件并要求它。
此过程不是threadave。在您的情况下,当您快速连续创建服务线程时,每个人都尝试自动加载全局类,您会遇到竞争条件并发生奇怪的事情。基本上,您有两种方法可以解决这个问题:
require 'host'
在启动线程之前显式加载模型。config.threadsave!
。这将(除其他外)在启动服务器时预加载所有类。这是首选,因此,您可以避免大量其他难以调试的并发问题。有关config.threadsafe!
的详细信息,请参阅excellent article by Aaron Patterson,认为它应该在Rails 4中完全删除。答案 1 :(得分:0)
假设您上面引用的代码位于模型的.rb文件中,请将require_relative "host"
添加到该文件的顶部。