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 は命名規則に一致するファイルのロードパスを検索し、それを必要とします。

このプロセスはスレッドセーブではありません。あなたの場合、サーバル スレッドを立て続けに作成し、それぞれが グローバルクラスを自動ロードしようとすると、競合状態になり、奇妙なことが起こります。基本的に、これに取り組むには 2 つのオプションがあります。

  1. require 'host'ループを開始する前に使用して、スレッドを開始する前にモデルを明示的にロードできます。
  2. またはconfig.threadsave!、イニシャライザで設定できます。これにより、サーバーの起動時にすべてのクラスがプリロードされます。これは、同時実行の問題をデバッグするのが難しい他のトラックロードを回避するため、推奨されます。の詳細については、Rails 4 で完全に削除する必要があると主張しているAaron Patterson による優れた記事config.threadsafe!を参照してください。
于 2012-07-04T17:27:43.063 に答える
0

上で引用したコードがモデルの .rb ファイルにあると仮定すると、require_relative "host"そのファイルの先頭に追加します。

于 2012-07-04T15:07:11.150 に答える