3

我在运行时收到此错误

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
4

2 回答 2

6

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

这个过程不是线程保存的。在您的情况下,当您连续快速创建 servral 线程时,每个线程都试图自动加载 全局类,您会遇到竞争条件并发生奇怪的事情。基本上,您有两种选择来解决这个问题:

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

假设您上面引用的代码位于模型的 .rb 文件中,请添加require_relative "host"到该文件的顶部。

于 2012-07-04T15:07:11.150 回答