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
本文介绍了Go语言中通道(Channel)的关闭及其通知机制。当通道被关闭后,读取不会阻塞,而是返回通道类型的零值。在select语句中,关闭的通道能被立即感知,允许程序优雅地终止生产者-消费者模型。通过示例代码展示了如何在生成随机数的协程中使用通道和退出通知来控制生产者的工作流程。
733

被折叠的 条评论
为什么被折叠?



