golang - 似乎无法删除http连接
我试图测量URL的连续加载时间,但无法删除http连接并从每次测量开始重新开始。有了这个代码...golang - 似乎无法删除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"))
}
}
我得到的测量是这样的:
2.75
0.13
0.09
0.12
0.115
所以它出现在HTTP连接正在从最初的负荷维持,因为后续加载速度更快。我也尝试在标题中将“连接”设置为“关闭”,但得到相同的结果:
req, err := http.NewRequest("GET", url, nil)
req.Header.Set("Connection", "close")
_, _ := client.Do(req)
我在做什么错?
我认为你需要分配从一开始给一个变量响应,然后关闭与response.Body.Close()
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())
}
我确实尝试过这一点......但是,同样的结果,第一次测量实际上更长。 –
噢好吧,知道我明白了,可以解决主机名导致第一个花费更长的时间?您可以使用IP地址对其进行测试,然后查看第一个是否需要更多时间 –
如果您要正确执行此操作,则需要首先检查错误,并在关闭错误之前尝试使用响应主体。这也与原来的问题相同,它会从http.Transport中泄漏连接 – JimB
连接你不是衡量你认为你是。您的第一个示例不仅每次都会打开一个新连接,但它在返回后会泄漏连接。永远不要丢弃'http.Transport',否则你会泄漏连接。你试图解决的实际问题是什么? – JimB
我试图从压力测试的目的页面加载(这是一个简化的版本 - 最终将来自多个进程)获得一致的结果,所以我试图模拟/创建一个新的连接每次(并关闭它正确)。很明显,循环内的页面负载测量#2-#5正在维护中。我假设它使用相同的连接...但不能说。 –
它不可能使用相同的连接,因为您每次都使用新的传输。我猜想这是你的解析器缓存产生差异。而不是猜测,检查正在建立的实际连接。还有'Request.Close'字段自动设置标题。 – JimB