2014-03-30 27 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

我想补充一点,一个好的经验法则是**缓冲是提高性能的工具**。千万不要因为使用缓冲而试图避免死锁等错误,因为这是徒劳的。如果你的应用程序不能在没有缓冲的情况下发生死锁,那么在添加缓冲时它不会发生死锁......但它可能运行得更快。首先设计一个简单的无死锁无缓冲网络,然后调整性能。 –