1、退出通知机制(close channel to broadcast)
- 读取已经关闭的通道不会引起阻塞,也不会导致panic,而是立即返回该通道存储类型的零值。
- 关闭select 监听的某个通道能使select立即感知此种通知,并能够进行相应的处理。
2、实例
//Generate 是一个随机数生成器
func GenerateInt(done chan struct{}) chan int {
ch := make(chan int)
go func(){
Label:
for{
select {
case ch <- rand.Int():
//增加一路监听,对退出通知信号done的监听
case <- done:
break Label
}
}
//收到通知后,关闭通道ch
close(ch)
}()
return ch
}
func main(){
done := make(chan struct{})
ch := GenerateInt(done)
fmt.Println(<-ch)
fmt.Println(<-ch)
//发送通知,告知生产者停止生产
close(done)
fmt.Println(<-ch)
fmt.Println(<-ch)
//此时,生产者已经退出
println("NumGoroutinue=",runtime.NumGoroutine())
}
参考资料:《Go语言核心编程》5.1.7