戈朗-can';我似乎没有放弃http连接

戈朗-can';我似乎没有放弃http连接,http,go,connection,Http,Go,Connection,我试图测量URL的连续加载时间,但无法断开http连接并重新开始每次测量。使用此代码 func getloadtime (url string) float64 { // setup client tr := &http.Transport{ DisableKeepAlives: true} client := &http.Client{Transport:tr} // page load and measure sta

我试图测量URL的连续加载时间,但无法断开http连接并重新开始每次测量。使用此代码

func getloadtime (url string) float64 {

    // setup client
    tr := &http.Transport{
        DisableKeepAlives: true}
    client := &http.Client{Transport:tr}

    // page load and measure
    start := time.Now()
    _, _ = client.Get(url)

    return(time.Since(start).Seconds())
}

func main () {
    for i := 0; i < 5; i++ {
        fmt.Println(getloadtime("http://www.google.com"))
    }
}
因此,似乎http连接是从初始加载开始维护的,因为后续加载要快得多。我还尝试在标题中将“连接”设置为“关闭”,但得到了相同的结果:

req, err := http.NewRequest("GET", url, nil)
req.Header.Set("Connection", "close")
_, _ := client.Do(req)

我做错了什么?

我认为您需要将GET的响应分配给一个变量,然后关闭与
response.Body.close()的连接。


你不是在衡量你认为自己是什么。您的第一个示例不仅每次打开一个新连接,而且在返回后会泄漏连接。切勿丢弃
http.Transport
,否则会泄漏连接。您试图解决的实际问题是什么?为了压力测试的目的,我试图从页面加载中获得一致的结果(这是一个简化的版本,最终将来自多个进程),因此每次我都尝试模拟/创建一个新连接(并正确关闭它)。显然,在循环中的pageload measurements#2-#5中正在维护某些内容。我假设它使用相同的连接。。。但不知道。它不可能使用相同的连接,因为您每次都在使用新的传输。我猜是你的解析器缓存造成了不同。检查正在进行的实际连接,而不是猜测。还有一个
Request.Close
字段可以自动设置头。是的,这就是为什么我将传输放在函数中,认为每次调用都会创建一个新的传输(这是新的),以从零重新创建开销。解析器缓存是需要探索的,尽管如果我反复执行代码,我会得到类似的结果,因此每次执行后都会释放缓存的内容,而且似乎任何类型的DNS缓存都会在代码执行之后得到维护。嗯……另一个注意事项……在Windows和Ubuntu上的结果相同。我确实试过这个。。。。虽然结果相同,但第一次测量的时间要长得多。哦,好吧,我明白了,解决主机名可能是第一次测量耗时更长的原因吗?您可以使用一个IP地址来测试它,看看第一个是否还需要更多的时间。如果要正确执行,您需要首先检查错误,并且应该在关闭响应主体之前尝试使用它。这也有与原始版本相同的问题,它将从
http.Transport泄漏连接
req, err := http.NewRequest("GET", url, nil)
req.Header.Set("Connection", "close")
_, _ := client.Do(req)
func getloadtime (url string) float64 {

    // setup client
    tr := &http.Transport{
        DisableKeepAlives: true}
    client := &http.Client{Transport:tr}

    // page load and measure
    start := time.Now()
    response, _ := client.Get(url)
    response.Body.Close()

    return(time.Since(start).Seconds())
}