ちょうど 1 年と少し後にこれを見ましたが、Google 社員にとっては手遅れではないことを願っています...
Typhoeusは、これに対する最良の解決策です。libcurl を非常にエレガントな方法でラップします。max_concurrency
窒息することなく、最大約200まで設定できます。
タイムアウトに関しては、Typhoeus に:timeout
フラグを渡すと、応答としてタイムアウトが登録されます。必要に応じて、要求を別のヒドラに戻して再試行することもできます。
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