通过 channel 的广播机制取消其他 goroutine 中执行的任务。
原理:channel 在关闭时会立刻向所有监听该 channel 的协程发送消息,其它 goroutine 在收到 channel 的关闭信号时取消任务。
// 通过channel的广播机制取消其他协程中的任务。
// 因为channel在关闭时会立刻向所有监听的协程发送信息,所以任务会在通道关闭时立刻取消。
package channel
import (
"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
}
}