LoadError:期望{app_path}/models/model file.rb定义模型名称

tri*_*ari 3 ruby multithreading ruby-on-rails-3

我在运行时遇到此错误

LoadError: Expected /home/user/Desktop/Tripurari/myapp/app/models/host.rb to define Host##
Run Code Online (Sandbox Code Playgroud)

但是它上面的每件事都是如此.有人可以告诉我方法下面的确切问题是什么.

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
Run Code Online (Sandbox Code Playgroud)

Hol*_*ust 6

问题可能是由自动加载器引起的.如果Host在第一次进入创建几个新线程的循环时尚未加载该类,则会自动加载,即Rails在加载路径中搜索与命名约定匹配的文件并要求它.

这个过程不是线程.在你的情况下,当你快速连续创建servral线程时,每个人都试图自动加载 全局类,你会遇到竞争条件和奇怪的事情.基本上,您有两种方法可以解决这个问题:

  1. require 'host'在开始循环之前,可以在启动线程之前显式加载模型.
  2. 或者您可以设置config.threadsave!初始化程序.这将(除其他外)在启动服务器时预加载所有类.这是首选,因此,您可以避免大量其他难以调试的并发问题.有关更多信息config.threadsafe!,请参阅Aaron Patterson优秀文章,认为它应该在Rails 4中完全删除.