如何在Go中发布http.Client?

时间:2016-04-18 08:15:26

标签: go garbage-collection

我为HTTP2连接构建了http.Client,我需要做些什么来释放客户端和使用的资源?

感谢。

2 个答案:

答案 0 :(得分:12)

http.Client不需要任何特殊方式来释放“已使用”资源。当它变得无法访问时,垃圾收集器将回收它所使用的内存。

http.Client不存储连接或状态信息。文档甚至声明应该重用http.Client

  

客户端的传输通常具有内部状态(缓存的TCP连接),因此应该重用客户端而不是根据需要创建客户端。客户可以安全地同时使用多个goroutine。

如果您使用(例如嵌入)http.Client构建自己的客户端并分配必须明确发布的资源,请在其上提供您自己的Close()方法并记录使用您自己的实现的任何人必须如果不再需要,请致电Close()

注意:

您可能会混淆的是,如果您使用http.Client进行HTTP操作(例如Client.Do()Client.Get()Client.Post()等),则会返回*http.Response的值,并且该响应确实包含连接,状态和其他资源,确实需要被释放,通常是通过Response.Body.Close()。引自http的包文档:

  

完成后,客户端必须关闭响应正文:

resp, err := http.Get("http://example.com/")
if err != nil {
  // handle error
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
// ...

它还记录在Client.Get()

  

当err为nil时,resp总是包含一个非零的resp.Body。调用者在完成阅读后应该关闭resp.Body。

答案 1 :(得分:0)

在Go 1.12中添加了CloseIdleConnections()方法。

https://golang.org/pkg/net/http/#Client.CloseIdleConnections

  

CloseIdleConnections关闭其传输上先前与先前请求连接的任何连接,但现在处于“保持活动”状态而处于空闲状态。它不会中断当前正在使用的任何连接。