Go中缓冲通道的用途是什么?

Rah*_*sad 6 channel go

我从这个问题" Golang - 什么是通道缓冲区大小? "中理解,如果通道被缓冲,它将不会阻塞.

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

但我不明白它是如何使用的.假设我有2个goroutine,第一个将接收data1而第二个接收data2然后它将阻塞,直到任何子程序可以自由处理data3.

我不明白它有什么区别?如果没有缓冲区,它将以相同的方式执行.你能解释一下缓冲有用的可能情况吗?

Dav*_*son 7

缓冲通道允许向缓冲​​通道添加数据的goroutine继续运行和执行操作,即使从通道读取的goroutines开始落后一点点.

例如,您可能有一个接收HTTP请求的goroutine,并且您希望它尽可能快.但是,您还希望它排队一些后台工作,例如发送电子邮件,这可能需要一段时间.所以HTTP goroutine只是解析用户的请求并快速将后台作业添加到缓冲的通道.其他goroutines会在有时间时处理它.如果您的HTTP请求突然激增,如果您的缓冲区足够大,用户将不会注意到HTTP的任何缓慢.

  • 我要补充说,一个好的经验法则是**缓冲是一种提高性能的工具**.永远不要错误地试图通过使用缓冲来避免死锁等,因为那是徒劳的.如果您的应用程序无法在没有缓冲的情况下死锁,则在添加缓冲时它不会死锁...但它可能运行得更快.首先设计一个简单的无死锁无缓冲网络,然后调整性能. (3认同)