go net/http 每次请求结束都断开了tcp连接了吗

go net/http 每次请求结束都断开了tcp连接了吗
我每次协程里面都新建了一个client

client := &http.Client{
        Timeout: time.Duration(Timeout * int(time.Second)),
    }

    values := url.Values{}
    values.Add("data", params)

    p := strings.NewReader(values.Encode())

    req, _ := http.NewRequest("POST", ip, p)

    req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

    res, err := client.Do(req)

每次协程都会运行这段http请求, 请问这个每次都会断开tcp连接吗?

阅读 7.2k
4 个回答

是的,你可以点进Do方法查看,他会运行req.closeBody()方法结束

Http Client启用Keeplive的情况下不会关闭TCP连接,方便下次请求时复用这个TCP连接。推荐高并发的系统下开启Keeplive,否则会产生大量处于TIME WAIT状态的TCP连接,导致客户端端口被消耗光

表怕,底层用的同一个transport (DefaultTransport),transport 管理连接池,client 只是壳子而已。

这种写法不推荐,client 官方文档说了是线程安全的,所以不要每一次都要创建客户端,对于单个客户端默认后台会维护一个连接池,而且现在默认 keep-alive 也都是打开的,所以不会断开.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题