亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

多線程如何影響 http keep-alive 連接?

多線程如何影響 http keep-alive 連接?

Go
萬千封印 2022-06-27 16:10:27
var (    httpClient *http.Client)const (    MaxIdleConnections int = 20    RequestTimeout     int = 5)// init HTTPClientfunc init() {    client := &http.Client{        Transport: &http.Transport{            MaxIdleConnsPerHost: MaxIdleConnections,        },        Timeout: time.Duration(RequestTimeout) * time.Second,    }    return client}func makeRequest() {    var endPoint string = "https://localhost:8080/doSomething"    req, err := http.NewRequest("GET", ....)        response, err := httpClient.Do(req)    if err != nil && response == nil {        log.Fatalf("Error sending request to API endpoint. %+v", err)    } else {        // Close the connection to reuse it        defer response.Body.Close()        body, err := ioutil.ReadAll(response.Body)        if err != nil {            log.Fatalf("Couldn't parse response body. %+v", err)        }                log.Println("Response Body:", string(body))    }}我在 Go 中有以下代碼。Go 使用 http-keep-alive 連接。因此,據我了解,httpClient.Do(req)不會創建新連接,因為 golang 使用默認的持久連接。根據我的理解,HTTP 持久連接一次發出一個請求,即第二個請求只能在第一個響應之后發出。但是,如果多個線程調用makeRequest()會發生什么?httpClient.Do(req)甚至在前一個請求得到響應之前會發送另一個請求嗎?我假設服務器超時客戶端建立的任何保持活動連接。如果服務器超時,那么下一次httpClient.Do(req)被調用,它會建立一個新的連接嗎?
查看完整描述

2 回答

?
慕后森

TA貢獻1802條經驗 獲得超5個贊

anhttp.Client有 a Transport,它將發出請求的許多低級細節委托給它。您可以通過為您的客戶提供自定義傳輸來更改幾乎任何內容。該答案的其余部分將在很大程度上假設您正在使用http.DefaultClient或至少是具有http.DefaultTransport.

發出新請求時,如果與相應服務器的空閑連接可用,則傳輸將使用它。

如果沒有空閑連接可用(因為從來沒有空閑連接,或者因為其他 goroutine 正在使用它們,或者因為服務器關閉了連接,或者出現了其他錯誤),那么傳輸將考慮建立一個新連接,受MaxConnsPerHost(默認值:無限制)。如果MaxConnsPerHost超出,則請求將阻塞,直到現有請求完成并且連接可用。否則,將為該請求建立新連接。

請求完成后,客戶端將緩存連接以供以后使用(受MaxIdleConns和限制MaxIdleConnsPerHostDefaultTransport全局限制為 100 個空閑連接,并且每個主機沒有限制)。

IdleConnTimeout如果空閑連接不用于發出請求,它們將在之后關閉;因為DefaultTransport限制是 90 秒。

所有這一切意味著,默認情況下,Go 將建立足夠的連接來滿足并行性(達到您可以調整的某些限制),但它也會通過將空閑連接池保持一定長度的時間來盡可能地重用 keep-alive 連接時間。


查看完整回答
反對 回復 2022-06-27
?
慕哥9229398

TA貢獻1877條經驗 獲得超6個贊

它不會影響 http keep-alive 連接,根據您的代碼,您正在使用全局 httpClient,如果按您的預期在多個線程中調用,這將不會創建新連接,并且它response.Body在關閉之前讀取。如果提供response.Body的是一個io.Closer,它將在請求后關閉。



查看完整回答
反對 回復 2022-06-27
  • 2 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號