通过 channel 的广播机制取消其他 goroutine 中执行的任务。

    原理:channel 在关闭时会立刻向所有监听该 channel 的协程发送消息,其它 goroutine 在收到 channel 的关闭信号时取消任务。

    1. // 通过channel的广播机制取消其他协程中的任务。
    2. // 因为channel在关闭时会立刻向所有监听的协程发送信息,所以任务会在通道关闭时立刻取消。
    3. package channel
    4. import (
    5. "fmt"
    6. "testing"
    7. "time"
    8. )
    9. func TestCancelTaskByChannel(t *testing.T) {
    10. var ch = sender()
    11. receiver(ch)
    12. time.Sleep(time.Millisecond * 50)
    13. }
    14. // 创建channel并在1秒后关闭
    15. func sender() chan int {
    16. var retCh = make(chan int)
    17. go func() {
    18. fmt.Println("sender begin.")
    19. time.Sleep(time.Millisecond * 1)
    20. close(retCh)
    21. fmt.Println("sender done.")
    22. }()
    23. return retCh
    24. }
    25. // 执行业务
    26. func receiver(ch chan int) {
    27. go func(ch chan int) {
    28. fmt.Println("task2 begin.")
    29. for {
    30. if Closed(ch) {
    31. break
    32. }
    33. // 执行业务操作
    34. fmt.Println("111")
    35. }
    36. fmt.Println("task2 done.")
    37. }(ch)
    38. }
    39. // 校验channel是否关闭
    40. func Closed(ch chan int) bool {
    41. select {
    42. // 从channel取到数据,说明channel已经发送关闭信号
    43. case <-ch:
    44. return true
    45. // 为从channle中取到数据,说明channel还未发送关闭信息
    46. default:
    47. return false
    48. }
    49. }