2014-03-30 25 views
4

我明白這個問題「Golang - What is channel buffer size?」,如果通道被緩衝,它不會阻塞。Go中緩衝頻道的用途是什麼?

c := make(chan int, 1) 
c <- data1 // doesn't block 
c <- data2 // blocks until another goroutine receives from the channel 
c <- data3 
c <- data4 

但我不明白它是什麼用法。假設我有2個例程,第一個會收到data1,第二個收到data2,然後它會被阻塞,直到任何子程序可以自由地處理data3爲止。

我不明白它有什麼不同?它會執行相同的方式沒有緩衝區。你能解釋一下緩衝有用的情況嗎?

回答

4

一個緩衝信道可以是將數據添加到緩衝通道繼續運​​行,做的事情,即使夠程從通道讀數開始落後的夠程一點點。

例如,您可能有一個goroutine正在接收HTTP請求,並希望它儘可能快。然而,你也希望它排隊一些後臺工作,比如發送電子郵件,這可能需要一段時間。因此,HTTP goroutine只是解析用戶的請求,並快速將後臺作業添加到緩衝的通道。其他goroutines會在有時間時處理它。如果你的HTTP請求突然激增,如果你的緩衝區足夠大,用戶不會注意到HTTP緩慢。

+3

我想補充一點,一個好的經驗法則是**緩衝是提高性能的工具**。千萬不要因爲使用緩衝而試圖避免死鎖等錯誤,因爲這是徒勞的。如果你的應用程序不能在沒有緩衝的情況下發生死鎖,那麼在添加緩衝時它不會發生死鎖......但它可能運行得更快。首先設計一個簡單的無死鎖無緩衝網絡,然後調整性能。 –