如何知道上下文是否已被取消?
在以下示例代码中,
- 有2个任务。
- 如果这些任务中的任何一个先完成,我想通过上下文取消了解其他任务。
- 作为示例的一部分,task2 将始终首先完成(在 task1 之前)。
package main
import (
"context"
"fmt"
"time"
)
func task2(ctx context.Context, ch chan int) {
for i := 0; i <= 10; i++ {
if ctx.Err() != nil {
// In case task1 completes first,
// I want to print this error. How do I reach this block?
fmt.Println("Cancelled 2", ctx.Err())
}
fmt.Println("Task2 ===== ", i)
time.Sleep(1 * time.Second)
if i == 2 {
ch <- 2
}
}
}
func task1(ctx context.Context, ch chan int) {
for i := 0; i <= 10; i++ {
if ctx.Err() != nil {
// In case task2 completes first,
// I want to print this error. How do I reach this block?
fmt.Println("Cancelled 1", ctx.Err())
}
fmt.Println("Task1 ----- ", i)
time.Sleep(1 * time.Second)
if i == 5 {
ch <- 1
}
}
}
func main() {
ctx, cancel := context.WithCancel(context.Background())
ch := make(chan int)
go task1(ctx, ch)
go task2(ctx, ch)
d := <-ch
cancel() // If either of task1 or task2 completes, invoke the cancel() func
fmt.Println("Task which completed first: ", d)
}