Настройка тайм-аутов для соединений Nokogiri

Почему nokogiri ждет пару секунд (3-5), когда сервер занят и я запрашиваю страницы одну за другой, но когда эти запросы зацикливаются, nokogiri не ждет и выдает сообщение о тайм-ауте. Я использую блок тайм-аута, обертывающий запрос, но nokogiri вообще не ждет этого времени. Любая предлагаемая процедура по этому поводу?

# this is a method from the eng class
def get_page(url,page_type)
 begin
  timeout(10) do
    # Get a Nokogiri::HTML::Document for the page we’re interested in...
    @@doc = Nokogiri::HTML(open(url))
  end
 rescue Timeout::Error
  puts "Time out connection request"
  raise
  end
end

 # this is a snippet from the main app calling eng class
 # receives a hash with urls and goes throgh asking one by one
 def retrieve_in_loop(links)
  (0..links.length).each do |idx|
    url = links[idx]
    puts "Visiting link #{idx} of #{links.length}"
    puts "link: #{url}"
    begin
        @@eng.get_page(url, product)
    rescue Exception => e
        puts "Error getting url: #{idx} #{url}"
        puts "This link will be skeeped. Continuing with next one"
    end
  end
end

person Snake Sanders    schedule 24.01.2013    source источник
comment
Время ожидания Nokogiri не истекает, потому что он не обрабатывает соединение, а OpenURI.   -  person the Tin Man    schedule 24.01.2013
comment
Кроме того, почему вы используете переменные класса? @@eng и @@doc намекают на то, что у вас есть проблемы с переменной областью видимости, которых вы не понимаете.   -  person the Tin Man    schedule 24.01.2013
comment
Спасибо, я избавлюсь от @@.   -  person Snake Sanders    schedule 25.01.2013


Ответы (1)


Блок timeout — это просто максимальное время, в течение которого этот код должен выполняться внутри блока, не вызывая исключения. Это не влияет ни на что внутри Nokogiri или OpenURI.

Вы можете установить тайм-аут на год, но OpenURI все равно может истечь, когда захочет.

Таким образом, ваша проблема, скорее всего, в том, что время ожидания OpenURI истекает при самой попытке подключения. У Нокогири нет тайм-аутов; это просто парсер.

Настройка времени ожидания чтения

Единственный тайм-аут, который вы можете настроить в OpenURI, — это тайм-аут чтения. Кажется, вы не можете изменить время ожидания соединения с помощью этого метода:

open(url, :read_timeout => 10)

Настройка времени ожидания подключения

Чтобы настроить время ожидания соединения, вам нужно будет использовать Net::HTTP напрямую:

uri = URI.parse(url)

http = Net::HTTP.new(uri.host, uri.port)
http.open_timeout = 10
http.read_timeout = 10

response = http.get(uri.path)

Nokogiri.parse(response.body)

Вы также можете взглянуть на некоторые дополнительные обсуждения здесь:

Время ожидания Ruby Net::HTTP
Увеличить время ожидания для Net::HTTP

person Casper    schedule 24.01.2013