实现思路
- 创建上下文:使用
context.Background()
创建一个基础上下文,然后通过 context.WithCancel
、context.WithTimeout
或 context.WithDeadline
等函数创建可取消或有时间限制的上下文。
- 传递上下文:将创建好的上下文传递给需要管理的子任务函数,这些函数通常是
goroutine
。
- 取消任务:在主函数或其他逻辑中,根据需要调用取消函数(通过
context.WithCancel
返回的取消函数)来取消上下文,所有基于该上下文的子任务会收到取消信号并进行相应处理。
代码示例
package main
import (
"context"
"fmt"
"time"
)
func subTask(ctx context.Context, taskName string) {
for {
select {
case <-ctx.Done():
fmt.Printf("%s 任务已取消\n", taskName)
return
default:
fmt.Printf("%s 正在执行...\n", taskName)
time.Sleep(1 * time.Second)
}
}
}
func main() {
// 创建一个可取消的上下文
ctx, cancel := context.WithCancel(context.Background())
// 启动子任务
go subTask(ctx, "子任务1")
go subTask(ctx, "子任务2")
// 模拟一段时间后取消任务
time.Sleep(3 * time.Second)
cancel()
// 等待一段时间,确保子任务收到取消信号并处理
time.Sleep(2 * time.Second)
}