Tôi chỉ thấy này, một năm và một chút sau, nhưng hy vọng không quá muộn đối với một số googler ...
Typhoeus đến nay là giải pháp tốt nhất cho việc này. Nó kết thúc tốt đẹp libcurl trong một thời trang thực sự thanh lịch. Bạn có thể đặt max_concurrency
lên tới khoảng 200 mà không bị nghẹt thở.
Đối với timeout, nếu bạn vượt qua Typhoeus một lá cờ :timeout
, nó sẽ chỉ đăng ký thời gian chờ là phản hồi ... và sau đó bạn thậm chí có thể đặt lại yêu cầu trong một hydra khác để thử lại nếu bạn muốn.
Đây là chương trình của bạn được viết lại bằng Typhoeus. Hy vọng rằng điều này sẽ giúp bất cứ ai đi qua trang này sau!
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
Nguồn
2015-01-05 01:54:28
Có vẻ như nó hoạt động. Nhưng làm thế nào để giết thread nếu máy chủ không đáp ứng sau 15 giây? – NVI
Bạn có thể sử dụng 'Timeout.timeotu (20) do .... end'. Tuy nhiên, điều đó làm tăng một lỗi, vì vậy bạn sẽ cần phải làm điều gì đó với luồng chương trình của bạn và có cách gắn thẻ rằng yêu cầu đã được hoàn thành ngoài việc kiểm tra xem khóa 'nội dung' tồn tại chưa. –
Là mạng của Ruby :: HTTP an toàn? – Daniel777