gpt4 book ai didi

Golang http.Post 留下打开的套接字

转载 作者:IT王子 更新时间:2023-10-29 02:02:37 26 4
gpt4 key购买 nike

我有以下 golang 代码,当在它自己的网络服务器内部调用时,它似乎没有关闭套接字。这会导致出现“太多打开的文件”消息。我已经阅读了所有关于 Body.Close() 的内容,正如您所看到的那样,它仍然表现不佳。

关于连接处理,我还遗漏了什么?

func sendRequest(ctx context.Context, endpoint, uri string, data []byte) (int, []byte) {
reqID := requestIDFromContext(ctx)
// The servers have internally signed certs which are technically "not trusted"
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
insecureclient := &http.Client{Transport: tr}

// Build the correct URL
url := endpoint + uri

requestbody := bytes.NewBuffer(data)
// Send our request and check for errors.
fmt.Println(reqID, "Forwarding request to URL:", url)
resp, err := insecureclient.Post(url, "application/json", requestbody)
if err != nil {
// This is where things happen when the connect goes bad
fmt.Println(reqID, err)
return 500, []byte("{}")
//return handleConnectionError(ctx, data, uri)
}
defer resp.Body.Close()

// Read response
responsebody, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(reqID, err)
responsebody = []byte("{}")
}

return resp.StatusCode, responsebody
}

FWIW,更改代码以使用“http.NewRequest”,然后使用“insecureclient.Do”和“Request.Close = true”似乎可以解决问题。

最佳答案

每个客户端(更准确地说,传输)维护自己的连接池。这意味着在每次 sendRequest 调用后,有一个连接“挂起”在 keep-alive 中。与其每次都创建一个新客户端,不如重新使用它。

关于Golang http.Post 留下打开的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47098757/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com