1、使用读写chan通知
使用sync.Map创建多个chan,每个chan通知一个协程。
代码略。
2、使用close通知
close chan不管是close之前订阅的,还是close之后订阅的,都可以通知到,用户不需要关注时机。
而且可以重复读,读取后不影响状态。(这点不同于管道中数据,管道中数据读一次就没了)。
可以参考context中Done()实现。
代码:
func main() {
testChan := make(chan bool)
var i int
for i=0;i<2;i++ {
go func() {
select {
case <-testChan:
fmt.Println("sub: rcv close")
}
}()
}
time.Sleep(2*time.Second)
go func (){
close(testChan)
fmt.Println("close chan")
}()
time.Sleep(2*time.Second)
select {
case <-testChan:
fmt.Println("main: rcv close: ")
}
time.Sleep(10*time.Second)
}
运行结果:
close chan
sub: rcv close
sub: rcv close
main: rcv close: