Typhoeus повторить попытку
В настоящее время Typhoeus не имеет автоматической повторной загрузки в случае сбоя. Как лучше всего повторить попытку загрузки, если загрузка не удалась?
def request
request ||= Typhoeus::Request.new("www.example.com")
request.on_complete do |response|
if response.success?
xml = Nokogiri::XML(response.body)
else
# retry to download it
end
end
end
1 ответ
Я думаю, что вам нужно реорганизовать свой код. У вас должно быть как минимум две очереди и потоки, с которыми вы работаете.
Первый - это очередь URL-адресов, с которых вы извлекаете данные, чтобы прочитать их Typhoeus::Request
,
Если очередь пуста, вы спите в этой теме в течение минуты, а затем ищите URL-адрес для извлечения. Если вы успешно прочитали страницу, проанализируйте ее и поместите полученный XML-документ во вторую очередь DOM для работы. Обработайте это из второго потока. И, если вторая очередь пуста, спите второй поток, пока не будет, над чем работать.
Если не удается прочитать URL-адрес, автоматически перенесите его в первую очередь.
Если обе очереди пусты, вы можете выйти из кода или оставить оба потока в спящем режиме, пока что-то не скажет, чтобы снова начать обработку URL-адресов, и вы снова заполняете первую очередь.
Вам также понадобится счетчик повторов, связанный с URL, иначе, если сайт отключится, вы можете повторить попытку навсегда. Вы можете поместить маленькие подмассивы в очередь как:
["url", 0]
где 0
это повторная попытка, или усложнение использования объекта или определения класса. Что бы вы ни делали, увеличивайте этот счетчик до тех пор, пока он не достигнет минимального значения, затем прекратите добавлять его в очередь и сообщите об этом или каким-либо образом удалите его из базы данных источников URL-адресов.
Это несколько похоже на код, который я написал пару раз для решения больших задач.
Посмотрите классы Руби Thread и Queue для примеров этого.
Также:
request ||= Typhoeus::Request.new("www.example.com")
не имеет смысла. request
будет ноль, когда этот код выполняется, поэтому ||=
всегда будет стрелять Вместо этого используйте:
request = Typhoeus::Request.new("www.example.com")
модифицируется соответствующим кодом для извлечения следующего значения из первой очереди, упомянутой выше.