1.ubuffered channel 使得进行数据交换的双方在一个可知的状态: 读的一方会一致堵塞直到对方传递数据过来, 写的一方会一直等待直到对方取到数据。
2.buffered channel 可以看作信号量,比如用于吞吐量控制:
var sem = make(chan int, MaxOutstanding)
func Serve(queue chan *Request) {
for req := range queue {
req := req // Create new instance of req for the goroutine.
sem <- 1
go func() {
process(req)
<-sem
}()
}
}
这使得 该程序最大只能有MaxOutStanding 个协程调用process