技巧1:关闭某个chan时,所有读取该chan的协程都会收到通知
注意事项:是直接关闭chan就可以了,不需要向这个协程内压入数据,因为压入数据的话最终还得关闭chan
举例:如果协程A希望协程B在处理完某个事情后自己能收到通知,可以向协程B的函数参数中传入一个chan,然后协程A阻塞读取该chan。协程B在需要通知其的时候关闭chan即可,这样协程A就会返回。
常用于:某个协程内新建了一个子协程,但是希望子协程在某个时候,例如初始化完成时通知自己
代码实验:
1. 主协程创建一个子协程,在子协程的函数参数中传入一个无缓冲的chan
2. 主协程阻塞读取这个chan
3. 子协程在2秒后关闭这个chan,可以发现主协程从阻塞中返回
实验结果如下图(可以发现子协程一旦关闭chan,主协程立马就从阻塞中返回了)
完整代码
package main
import ("fmt""time"
)
func func1(c chan bool) {fmt.Println("func1 init start, time=", time.Now().UnixMilli())// 用sleep模拟初始化工作time.Sleep(time.Second)fmt.Println("func1 init end, time=", time.Now().UnixMilli())close(c)time.Sleep(time.Second)fmt.Println("func1 end, time=", time.Now().UnixMilli())
}func main() {fmt.Println("main start, time=", time.Now().UnixMilli())c := make(chan bool, 1)go func1(c)// 开始阻塞等待<-cfmt.Println("main continue, time=", time.Now().UnixMilli())time.Sleep(time.Second * 2)
}