Механизировать тайм-ауты - PullRequest
       45

Механизировать тайм-ауты

0 голосов
/ 01 октября 2019

Я пытаюсь создать фрагмент кода, который ищет страницы с тайм-аутом, используя Mechanize и Ruby. Мой тестовый стенд включает одну страницу, специально написанную для тайм-аута, и 3 страницы, которые работают нормально. Вот код:

urls = ['http://example.com/regular.php','http://example.com/regular2.php','http://example.com/regular3.php', 'http://example.com/tmeout.php']
m = Mechanize.new

urls.each do |url|
    begin
        status = Timeout::timeout(5.0) {
            m.get(url)
        }
   rescue Timeout::Error
       puts "TIMED OUT: " + url
   end
end

Когда URL-адрес тайм-аута является последним элементом в списке, это прекрасно работает. Ссылка timeout выводится на консоль. Однако, когда ссылка timeout не является последним элементом в списке (например, я помещаю его первым в ссылку), ссылка timeout печатается на консоли, однако некоторые ссылки regular также печатаются на консоли. Это также представляется недетерминированным. Каждый раз, когда я перезапускаю его, на консоль выводится другой набор ссылок.

Может кто-нибудь сказать мне, почему это так и какое исправление доступно? Я заметил, что создание нового mechanize для каждой итерации решает проблему - однако это не вариант, потому что другие части программы используют файлы cookie из m, которые будут сброшены при создании нового экземпляра. Какие-нибудь исправления?

1 Ответ

0 голосов
/ 01 октября 2019

Быстрый Google показал несколько идей. Один из них - попытаться сбросить Mechanize после сбоя.

rescue Timeout::Error
   begin
    puts "TIMED OUT: " + url
    m = Mechanize.new
   end
...