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

但我不明白它有什么用。假设我有 2 个 goroutine,第一个将接收 data1,第二个接收 data2,然后它将阻塞,直到任何子例程可以自由处理 data3。


我不明白这有什么区别?如果没有缓冲区,它会以相同的方式执行。你能解释一下缓冲有用的可能场景吗?


隔江千里
浏览 232回答 2
2回答

慕容森

缓冲通道允许向缓冲通道添加数据的 goroutine 继续运行和做事,即使从通道读取的 goroutine 开始有点落后。例如,您可能有一个接收 HTTP 请求的 goroutine,并且您希望它尽可能快。但是,您还希望它排队一些后台作业,例如发送电子邮件,这可能需要一段时间。所以 HTTP goroutine 只是解析用户的请求,并快速将后台作业添加到缓冲通道中。其他 goroutine 会在有时间的时候处理它。如果您的 HTTP 请求突然激增,如果您的缓冲区足够大,用户将不会注意到 HTTP 中的任何缓慢。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go