2016-11-04 4 views
0

Я ожидаю, что этот кусок кода, чтобы работать в течение не более чем 5 секунд:Рубин - тайм-аут не работает

require 'httpi' 
require 'timeout' 

puts Time.new 
begin 
    request,response=nil,nil 
    Timeout::timeout(5){ 
     request=HTTPI::Request.new(url: "http://example.com") 
     response=HTTPI.get(request) 
    } 
rescue 
    puts "except: #{$!}" 
ensure 
    puts Time.new 
end 

Но это выход я получаю:

2016-11-04 09:44:55 -0400 
D, [2016-11-04T09:44:55.916557 #2476] DEBUG -- : HTTPI GET request to example.com (net_http) 
except: execution expired 
2016-11-04 09:45:16 -0400 

I Предполагая, что таймаут HTTP по умолчанию по умолчанию равен 20 секундам, поэтому Timeout :: timeout позволяет просто запускать код, сколько он хочет. Зачем?

ответ

1

Как вы можете видеть here, here и here, Timeout модуль в Руби известен тем, что некоторые проблемы.

Вы должны рассмотреть возможность использования этого модуля, если это не крайне необходимо.

Вместо этого вы можете использовать опции read_timeout и/или open_timeout, предоставляемые API HTTPI.

request = HTTPI::Request.new(url: "http://example.com") 
request.open_timeout = 5 # seconds 
request.read_timeout = 5 # seconds 
response = HTTPI.get(request)