Я только что видел это год и чуть позже, но, надеюсь, не слишком поздно для какого-нибудь гуглера ...
Typhoeus , безусловно, лучшее решение для этого. Это оборачивает libcurl действительно элегантным способом. Вы можете установить max_concurrency
до 200 без удушья.
Что касается тайм-аутов, если вы передадите Тайфуюсу флаг :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