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

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

當將單個 http 客戶端用于多個 goroutine 時,在一個線程上編輯傳輸是否會影響

當將單個 http 客戶端用于多個 goroutine 時,在一個線程上編輯傳輸是否會影響

Go
千萬里不及你 2022-09-26 17:32:59
假設我的程序中有一個全局網絡/http 客戶端。在這個程序中,我有幾個戈魯丁向同一個全球客戶提出請求。例如戈朗偽代碼:package mainfunc editTransportAndFetch(c *http.Client) {    c.Transport = &http.Transport{        // Make some unique change here    }    c.Get("https://www.google.com")}func main() {    client := http.Client        // Spawns 10 processes    for i := 0; i < 10; i++ {        go editTransportAndFetch(client)    }}在這個偽代碼示例中,我演示了生成 http 的 10 個進程。正在編輯傳輸。在本例中,正在進行相同的精確更改,因此干擾可能不是一個大問題。但是,無論如何,如果這些進程同時發生,則更新全局客戶端傳輸的一個進程是否會干擾其他進程可能正在使用的傳輸?我的最終用例是,我希望有一個全球客戶端,并且能夠指定自定義 DialTLSContext,但僅適用于某些請求。我不希望使用 DialTLS 上下文的請求也可能同時運行。我擔心如果我編輯網址。傳輸一個請求的客戶端,它可能會干擾并導致另一個請求也使用 DialTLSContext,即使我不希望它這樣做。
查看完整描述

2 回答

?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

如果在多個 goroutine 之間共享同一個客戶端實例,并且從其中一個 goroutine 修改該客戶端,則該行為是未定義的,因為它是數據爭用。

如果要修改某些戈魯廷的客戶端,則無需使用單個客戶端,并且可以為每個戈魯廷創建一個新客戶端。

如果要在 main 中配置一個客戶端,并將其用作所有 goroutine 的模板,請按值傳遞客戶端,而不是 ,因此該模板的副本將傳遞給每個 goroutine,并且每個 goroutine 將在其自己的副本上工作,在下面共享公共副本。如果將 設置為其他內容,則由于 是副本,因此它仍然是安全的。*clientTransportTransportClient

但是,如果您修改了實例中的某些內容(即 ),那又是一個爭用條件。別這樣。TransportRoundTripper


查看完整回答
反對 回復 2022-09-26
?
慕容3067478

TA貢獻1773條經驗 獲得超3個贊

根據文檔(https://golang.org/src/net/http/client.go),Http 客戶端是線程安全的:

客戶端對于多個戈魯廷的并發使用是安全的。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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