Jon*_*ono 3 ruby multithreading ruby-on-rails nokogiri ruby-on-rails-3
我有一个控制器,我试图从远程源获取XML文件.
就像是:
@artist = Nokogiri.XML(open(url).read)
Run Code Online (Sandbox Code Playgroud)
但是,我希望一次执行多个这些不同的数据.我可以用某种方式使用线程吗?
单独执行一个需要400毫秒.因此,当它们连续三次执行时,响应最多可达1s +.
是的,你可以使用线程:
named_urls = {
artist: 'http://foo.com/bar',
song: 'http://foo.com/jim',
# etc.
}
@named_xmls = {}
one_at_a_time = Mutex.new
named_urls.map do |name,url|
Thread.new do
doc = Nokogiri.XML(open(url).read)
one_at_a_time.synchronize{ @named_xmls[name] = doc }
end
end.each(&:join)
# At this point @named_xmls will be populated will all Nokogiri documents
Run Code Online (Sandbox Code Playgroud)
我不确定在共享散列中写入不同的密钥是否需要Mutex,但是为了安全起见并不会有害.