3 回答
TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
連接被添加到函數(shù)Transport.tryPutIdleConn中的池中。如果Transport.DisableKeepAlives為 true 或?Transport.MaxIdleConnsPerHost小于零,則不會(huì)合并連接。
設(shè)置任一值都會(huì)禁用池化。Connection: close當(dāng)DisableKeepAlives 為true 時(shí),傳輸會(huì)添加請(qǐng)求標(biāo)頭。這可能是理想的,也可能不是理想的,具體取決于您正在測(cè)試的內(nèi)容。
設(shè)置DisableKeepAlives的方法如下:
t?:=?http.DefaultTransport.(*http.Transport).Clone()
t.DisableKeepAlives?=?true
c?:=?&http.Client{Transport:?t}在操場(chǎng)上運(yùn)行DisableKeepAlives = true 的演示。
設(shè)置 MaxIdleConnsPerHost 的方法如下:
t?:=?http.DefaultTransport.(*http.Transport).Clone()
t.MaxIdleConnsPerHost?=?-1
c?:=?&http.Client{Transport:?t}在操場(chǎng)上運(yùn)行 MaxIdleConnsPerHost = -1 的演示。
上面的代碼克隆了默認(rèn)傳輸以確保使用默認(rèn)傳輸選項(xiàng)。如果您明確想要問題中的選項(xiàng),請(qǐng)使用
????c?=?&http.Client{
????????Transport:?&http.Transport{
????????????DialContext:?(&net.Dialer{
????????????????Timeout:???5?*?time.Second,
????????????????KeepAlive:?5?*?time.Second,
????????????}).DialContext,
????????????TLSHandshakeTimeout:???5?*?time.Second,
????????????ResponseHeaderTimeout:?5?*?time.Second,
????????????ExpectContinueTimeout:?1?*?time.Second,
????????????DisableKeepAlives:?true,
????????},
????}或者
????c?=?&http.Client{
????????Transport:?&http.Transport{
????????????DialContext:?(&net.Dialer{
????????????????Timeout:???5?*?time.Second,
????????????????KeepAlive:?5?*?time.Second,
????????????}).DialContext,
????????????TLSHandshakeTimeout:???5?*?time.Second,
????????????ResponseHeaderTimeout:?5?*?time.Second,
????????????ExpectContinueTimeout:?1?*?time.Second,
????????????MaxIdleConnsPerHost:?-1,
????????},
????}MaxIdleConnsPerHost 不限制每個(gè)主機(jī)的活動(dòng)連接數(shù)。?
通過將Dialer.KeepAlive設(shè)置為 -1,不會(huì)禁用池 。
TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊
您需要將DisableKeepAlives、true和MaxIdleConnsPerHost-1 設(shè)置為。
從文檔中:
// DisableKeepAlives, if true, disables HTTP keep-alives and
// will only use the connection to the server for a single
// HTTP request.
https://golang.org/src/net/http/transport.go,第 166 和 187 行
因此,您的客戶端必須按如下方式初始化
c = &http.Client{
Transport: &http.Transport{
DialContext: (&net.Dialer{
Timeout: 5 * time.Second,
}).DialContext,
TLSHandshakeTimeout: 5 * time.Second,
ResponseHeaderTimeout: 5 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
DisableKeepAlives: true,
MaxIdleConnsPerHost: -1
},
}
如果您使用 1.7 之前的 Go 版本,那么您需要消耗主體的所有緩沖區(qū),并且只有在調(diào)用request.Body.Close(). 相反,如果您使用的版本大于或等于 1.7,則可以推遲關(guān)閉,而無需采取額外的預(yù)防措施。
禁用連接池但仍然能夠執(zhí)行并行請(qǐng)求的示例庫: https: //github.com/alessiosavi/Requests
TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個(gè)贊
http.Transport 有一個(gè)名為MaxConnsPerHost
MaxConnsPerHost 可以選擇限制每個(gè)主機(jī)的連接總數(shù),包括處于撥號(hào)、活動(dòng)和空閑狀態(tài)的連接。
包括撥號(hào)、活動(dòng)和空閑狀態(tài)
- 3 回答
- 0 關(guān)注
- 265 瀏覽
添加回答
舉報(bào)
