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)
问题可能是由自动加载器引起的.如果Host在第一次进入创建几个新线程的循环时尚未加载该类,则会自动加载,即Rails在加载路径中搜索与命名约定匹配的文件并要求它.
这个过程不是线程.在你的情况下,当你快速连续创建servral线程时,每个人都试图自动加载 全局类,你会遇到竞争条件和奇怪的事情.基本上,您有两种方法可以解决这个问题:
require 'host'在开始循环之前,可以在启动线程之前显式加载模型.config.threadsave!初始化程序.这将(除其他外)在启动服务器时预加载所有类.这是首选,因此,您可以避免大量其他难以调试的并发问题.有关更多信息config.threadsafe!,请参阅Aaron Patterson的优秀文章,认为它应该在Rails 4中完全删除.| 归档时间: |
|
| 查看次数: |
1858 次 |
| 最近记录: |