【Duke】Context与任务取消 027 - PingPongGooo/GoFoundation GitHub Wiki

关联任务的取消

go 1.9以后 把 Context 内置到 go 的 包中

根 Context: 通过context.Background() 创建
子 Context:context.WithCancel(parentContext)创建
ctx,cancel := context.WithCancel(context.Background())

当前Context被取消时,基于他的子 context都会被取消
接收取消通知 <-ctx.Done()


package cancel_by_context

import (
	"context"
	"fmt"
	"testing"
	"time"
)


func isCancelled(ctx context.Context) bool {
	select {
	case <- ctx.Done():
		return true
	default:
		return false
	}
}



func TestCancel(t *testing.T)  {
	ctx,cancel := context.WithCancel(context.Background())
	for i := 0; i < 5; i++ {
		go func(i int, ctx context.Context) {
			for {
				if isCancelled(ctx){
					break
				}
				time.Sleep(time.Millisecond * 5)
			}
			fmt.Println(i, "Cancelled")
		}(i, ctx)
	}

	cancel()

	time.Sleep(time.Second * 1)
}