package main import ( "context" "fmt" "time" ) // 模拟一个可被取消的循环任务 func worker(ctx context.Context, name string) { for { select { case <-ctx.Done(): fmt.Println(name, "收到取消信号:", ctx.Err()) return default: fmt.Println(name, "还在干活...") time.Sleep(500 * time.Millisecond) } } } func main() { ctx, cancel := context.WithCancel(context.Background()) go worker(ctx, "worker-1") go worker(ctx, "worker-2") time.Sleep(2 * time.Second) fmt.Println("main: 决定取消所有 worker") cancel() // 发出取消信号 time.Sleep(1 * time.Second) fmt.Println("main 结束") }