我从这个问题" 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.
我不明白它有什么区别?如果没有缓冲区,它将以相同的方式执行.你能解释一下缓冲有用的可能情况吗?
缓冲通道允许向缓冲通道添加数据的goroutine继续运行和执行操作,即使从通道读取的goroutines开始落后一点点.
例如,您可能有一个接收HTTP请求的goroutine,并且您希望它尽可能快.但是,您还希望它排队一些后台工作,例如发送电子邮件,这可能需要一段时间.所以HTTP goroutine只是解析用户的请求并快速将后台作业添加到缓冲的通道.其他goroutines会在有时间时处理它.如果您的HTTP请求突然激增,如果您的缓冲区足够大,用户将不会注意到HTTP的任何缓慢.