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

时间:2014-03-30 18:03:59

标签: go channel

我从这个问题“Golang - What is channel buffer size?”了解到,如果频道被缓冲,它将不会阻止。

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个goroutine,第一个将接收data1而第二个接收data2然后它将阻塞,直到任何子程序可以自由处理data3。

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

2 个答案:

答案 0 :(得分:7)

缓冲通道允许将数据添加到缓冲通道的goroutine继续运行和处理,即使从通道读取的goroutines开始落后一点点。

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

答案 1 :(得分:1)