HTTP:打开与new的连接后是否需要关闭带有finish的连接?

时间:2018-06-25 19:22:37

标签: ruby http

Ruby核心附带的Net :: HTTP API中有几种方法。诸如Net :: HTTP.get,Net :: HTTP.get_response和Net :: HTTP.post_form之类的对象不会持久连接。但是,:: start和:: new确实可以保持连接。实际上,:: start会使一个块保持打开连接状态,直到该块退出:

uri = URI("example.com")
Net::HTTP.start(uri.host, uri.port) do |http|
  response1 = http.get('path1')
  response2 = http.get('path2')
end

现在您可以使用:: new代替:: start:

  http = Net::HTTP.new('example.com')
  http.start
  response1 = http.get('path1')
  response2 = http.get('path2')

但是我必须手动关闭连接吗?这是必须的还是我可以不使用它?

begin
  http = Net::HTTP.new('example.com')
  http.start
  response1 = http.get('path1')
  response2 = http.get('path2')
ensure
  http.finish
end

如果我跳过结束呼叫,这会在应用程序中造成某种some肿或内存泄漏吗?

1 个答案:

答案 0 :(得分:0)

根据文档,使用new不会打开连接:

  

创建一个新的Net :: HTTP对象,而无需打开TCP连接或   HTTP会话。

但是要回答您的问题,是的,您应该在使用它们后关闭连接。该连接最终将关闭,但这是一个坏习惯,不要在使用完非托管资源后清理它们。

首选方法是您演示的方法,将start与块一起使用,可确保在块退出时连接将关闭。

编辑

我不够具体。我指的是类方法start,而不是实例方法start。类方法签名如下所示:

start(address, port, p_addr, p_port, p_user, p_pass, &block)
start(address, port=nil, p_addr=nil, p_port=nil, p_user=nil, p_pass=nil, opt, &block)

可以找到它的文档here,尽管我相信您已经可以确定参数了。