我刚刚看到这个,一年多一点,但希望对于一些谷歌人来说还不算太晚......
Typhoeus是迄今为止最好的解决方案。它以一种非常优雅的方式包装了 libcurl。您可以将其设置max_concurrency
为 200 左右而不会窒息。
关于超时,如果您向 Typhoeus 传递一个:timeout
标志,它只会将超时注册为响应……然后您甚至可以将请求放回另一个 hydra 中,如果您愿意,可以再试一次。
这是用 Typhoeus 重写的程序。希望这对以后遇到此页面的任何人有所帮助!
require 'typhoeus'
urls = [
'http://www.google.com/',
'http://www.yandex.ru/',
'http://www.baidu.com/'
]
hydra = Typhoeus::Hydra.new
successes = 0
urls.each do |url|
request = Typhoeus::Request.new(url, timeout: 15000)
request.on_complete do |response|
if response.success?
puts "Successfully requested " + url
successes += 1
else
puts "Failed to get " + url
end
end
hydra.queue(request)
end
hydra.run
puts "Fetched all urls!" if successes == urls.length