通过 channel 的广播机制取消其他 goroutine 中执行的任务。
原理:channel 在关闭时会立刻向所有监听该 channel 的协程发送消息,其它 goroutine 在收到 channel 的关闭信号时取消任务。
// 通过channel的广播机制取消其他协程中的任务。// 因为channel在关闭时会立刻向所有监听的协程发送信息,所以任务会在通道关闭时立刻取消。package channelimport ("fmt""testing""time")func TestCancelTaskByChannel(t *testing.T) {var ch = sender()receiver(ch)time.Sleep(time.Millisecond * 50)}// 创建channel并在1秒后关闭func sender() chan int {var retCh = make(chan int)go func() {fmt.Println("sender begin.")time.Sleep(time.Millisecond * 1)close(retCh)fmt.Println("sender done.")}()return retCh}// 执行业务func receiver(ch chan int) {go func(ch chan int) {fmt.Println("task2 begin.")for {if Closed(ch) {break}// 执行业务操作fmt.Println("111")}fmt.Println("task2 done.")}(ch)}// 校验channel是否关闭func Closed(ch chan int) bool {select {// 从channel取到数据,说明channel已经发送关闭信号case <-ch:return true// 为从channle中取到数据,说明channel还未发送关闭信息default:return false}}
