2015-07-11 112 views
0

假設我有以下功能:具有不同超時時間的Golang goroutine-safe http客戶端?

func SendRequest(c *Client, timeout time.Duration) { 
    if timeout > 0 { 
    c.Timeout = timeout 
    } else { 
    c.Timeout = defaultTimeout 
    } 
    ... 
} 

我想允許多箇中間人程序來調用這個函數(共享同一個HTTP客戶端),但這顯然是書面的方式不能保證夠程安全。 (也改變傳入客戶端的超時也是奇怪的...)

我不知道什麼是最好的辦法做到這一點。我應該爲不同的超時使用不同的客戶端嗎?我應該使用一些互斥鎖嗎?或者一般來說,我如何共享具有不同超時時間的HTTP客戶端?

謝謝!

回答

1

您需要使用不同的客戶端。即使使用互斥體保護您的功能,您也無法保護客戶端的內部訪問權限,並且另一個goroutine可以在發出請求時更改它。

多個客戶端仍然可以共享相同的傳輸,並且他們都將使用DefaultTransport(如果未指定)。

+0

因此,對於Go中的HTTP,哪些部分是昂貴的,以便我們應該儘可能重用,如果有的話,爲什麼? – aforaudrey

+1

@丹青:你什麼意思是「哪一部分很貴」?客戶和運輸 - 你是什麼意思的「昂貴」?一切都有成本,所以重用你所能做的。例如,Transport是處理連接的地方,因此使用單個傳輸會增加重新使用連接的可能性。 – JimB