package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建初始上下文
ctx := context.Background()
// 派生可取消的上下文
cancelCtx, cancel := context.WithCancel(ctx)
// 启动一个 Goroutine 执行任务
go doTask(cancelCtx)
// 等待一段时间后取消任务
time.Sleep(1 * time.Second)
cancel() // 调用 cancel 函数取消任务
// 等待任务结束
time.Sleep(1 * time.Second)
}
func doTask(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Task canceled")
return
default:
fmt.Println("Running task...")
time.Sleep(500 * time.Millisecond)
}
}
}
在上述示例中,我们首先使用 context.Background() 创建了一个初始的上下文 ctx。然后,使用 context.WithCancel(ctx) 派生了一个可取消的上下文 cancelCtx 和相应的取消函数 cancel。接下来,我们在 doTask() 函数中执行一个任务,并在每次循环中检查上下文的取消信号。
在主函数中,我们等待一段时间后,调用 cancel() 函数取消任务。这会触发与 cancelCtx 关联的上下文的取消信号,使得 doTask() 函数可以感知到任务已被取消,并退出执行。
总之,context.WithCancel(ctx) 用于派生一个可取消的上下文,并返回与之关联的取消函数。通过调用取消函数,可以触发与上下文相关的 Goroutine 的取消信号,从而实现对任务的取消和中止。
标签:context,取消,ctx,golang,应用,time,cancel,上下文
From: https://www.cnblogs.com/securitybob/p/17425175.html