【问题标题】:Preventing timeout when connecting to a URL连接到 URL 时防止超时
【发布时间】:2014-11-21 20:58:57
【问题描述】:

我想在下面的代码中查看使用Benchmark 访问网址所花费的时间。我也尝试在没有基准的情况下做同样的事情。即在测试开始和测试结束时获取时间,将两者相减得到时间。两种方法都以相同的超时错误结束。

require 'open-uri'
require 'benchmark'

response = nil
puts "opening website with benchmark..."
puts Benchmark.measure{
  response = open('http://mywebsite.com')
}

puts "Done !"
status = response.status
puts status

错误:

opening website with benchmark...
C:/ruby/lib/ruby/1.8/timeout.rb:64:in `rbuf_fill': execution expired (Timeout::Error)
    from C:/ruby/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
    from C:/ruby/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
    from C:/ruby/lib/ruby/1.8/net/protocol.rb:126:in `readline'
    from C:/ruby/lib/ruby/1.8/net/http.rb:2028:in `read_status_line'
    from C:/ruby/lib/ruby/1.8/net/http.rb:2017:in `read_new'
    from C:/ruby/lib/ruby/1.8/net/http.rb:1051:in `request'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:248:in `open_http'
    from C:/ruby/lib/ruby/1.8/net/http.rb:543:in `start'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:242:in `open_http'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:616:in `buffer_open'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:162:in `catch'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:518:in `open'
    from C:/ruby/lib/ruby/1.8/open-uri.rb:30:in `open'
    from C:/code/test.rb:7
    from C:/ruby/lib/ruby/1.8/benchmark.rb:293:in `measure'
    from C:/code/test.rb:6

当我尝试在浏览器中连接到此 URL 时,始终需要大约 2-3 分钟才能访问。

我搜索了谷歌,但没有找到对我的问题有用的答案。我知道我必须 更改某些东西的超时设置,但无法确定是哪一个。有人可以帮忙吗?

【问题讨论】:

    标签: ruby ruby-1.8


    【解决方案1】:

    Net::HTTP 用于open-uri 然后用于请求的连接的BufferedIO 类有一个read_timeout attribute set to 60 seconds

    Net::HTTP 类提供了一个setter read_timeout for that

    不幸的是,open-urisets up 请求的方式并没有为您提供在请求之前获取该设置的方法,或者轻松覆盖默认的 60

    您可能需要自己使用Net::HTTP

    link = URI.parse(url)
    request = Net::HTTP::Get.new(link.path)
    response = Net::HTTP.start(link.host, link.port) {|http|
      http.read_timeout = 100 #Default is 60 seconds
      http.request(request)
    }
    

    this answer窃取的代码

    编辑:或升级到支持:read_timeout = x 选项 Dave Newton 的 1.9。

    【讨论】:

      【解决方案2】:

      使用:read_timeout 选项,以秒为单位,例如,

      open('foo.com', :read_timeout => 10)
      

      http://ruby-doc.org/stdlib-1.8.7/libdoc/open-uri/rdoc/OpenURI/OpenRead.html

      【讨论】:

      • 谢谢。如何将超时设置为无穷大?无法从您提供的链接中快速得到答案。超时 = -1 ???
      • 我收到错误 - syntax error, unexpected ':', expecting ')' response = open(url, read_timeout: 300)
      • @BoratSagdiyev ...那么您可能应该为您的 Ruby 版本使用正确的映射语法。我将编辑我的答案,但能够从代码示例中推断是一项宝贵的技能。
      • 谢谢戴夫。我刚刚意识到我不能使用那个论点,因为我有 ruby​​ 1.8。有替代方案吗?谢谢。错误 - check_options': unrecognized option: read_timeout (ArgumentError)
      • @BoratSagdiyev Oy,我在比较版本时误读了我使用的版本——我的错!将删除答案-对此感到抱歉。
      猜你喜欢
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2021-06-28
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多