Widziałem tylko ten, w roku, a nieco później, ale mam nadzieję, że nie jest zbyt późno dla niektórych Googler ...
Typhoeus zdecydowanie najlepsze rozwiązanie tego problemu. Zawijanie libcurl w naprawdę elegancki sposób. Możesz ustawić max_concurrency
do około 200 bez dławienia.
W przypadku przekroczenia limitu czasu, jeśli przekażesz typhoeusowi flagę :timeout
, zarejestruje on tylko czas oczekiwania jako odpowiedź ... a następnie możesz złożyć żądanie ponownie w innej hydrze, aby spróbować ponownie, jeśli chcesz.
Oto Twój program napisany ponownie z Typhoeus. Mam nadzieję, że pomoże to każdemu, kto natknie się na tę stronę później!
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
Wydaje się, że działa. Ale jak zabić wątek, jeśli serwer nie odpowie po 15 sekundach? – NVI
Możesz użyć 'Timeout.timeotu (20) do .... end'. Wiąże się to jednak z błędem, więc musisz coś zrobić z przepływem programu i mieć możliwość oznaczania, że żądanie zostało zakończone, inne niż sprawdzanie, czy istnieje klucz "content". –
Czy sieć wątków Ruby :: HTTP jest bezpieczna? – Daniel777