假設我的程序中有一個全局網絡/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 將在其自己的副本上工作,在下面共享公共副本。如果將 設置為其他內容,則由于 是副本,因此它仍然是安全的。*client
Transport
Transport
Client
但是,如果您修改了實例中的某些內容(即 ),那又是一個爭用條件。別這樣。Transport
RoundTripper

慕容3067478
TA貢獻1773條經驗 獲得超3個贊
- 2 回答
- 0 關注
- 114 瀏覽
添加回答
舉報
0/150
提交
取消