多个Nokogiri立即请求

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 +.

Phr*_*ogz 5

是的,你可以使用线程:

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,但是为了安全起见并不会有害.