2 回答

TA貢獻1802條經驗 獲得超5個贊
anhttp.Client
有 a Transport
,它將發出請求的許多低級細節委托給它。您可以通過為您的客戶提供自定義傳輸來更改幾乎任何內容。該答案的其余部分將在很大程度上假設您正在使用http.DefaultClient
或至少是具有http.DefaultTransport
.
發出新請求時,如果與相應服務器的空閑連接可用,則傳輸將使用它。
如果沒有空閑連接可用(因為從來沒有空閑連接,或者因為其他 goroutine 正在使用它們,或者因為服務器關閉了連接,或者出現了其他錯誤),那么傳輸將考慮建立一個新連接,受MaxConnsPerHost
(默認值:無限制)。如果MaxConnsPerHost
超出,則請求將阻塞,直到現有請求完成并且連接可用。否則,將為該請求建立新連接。
請求完成后,客戶端將緩存連接以供以后使用(受MaxIdleConns
和限制MaxIdleConnsPerHost
;DefaultTransport
全局限制為 100 個空閑連接,并且每個主機沒有限制)。
IdleConnTimeout
如果空閑連接不用于發出請求,它們將在之后關閉;因為DefaultTransport
限制是 90 秒。
所有這一切意味著,默認情況下,Go 將建立足夠的連接來滿足并行性(達到您可以調整的某些限制),但它也會通過將空閑連接池保持一定長度的時間來盡可能地重用 keep-alive 連接時間。

TA貢獻1877條經驗 獲得超6個贊
它不會影響 http keep-alive 連接,根據您的代碼,您正在使用全局 httpClient,如果按您的預期在多個線程中調用,這將不會創建新連接,并且它response.Body
在關閉之前讀取。如果提供response.Body
的是一個io.Closer
,它將在請求后關閉。
- 2 回答
- 0 關注
- 132 瀏覽
添加回答
舉報