package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个带有取消功能的上下文
ctx, cancel := context.WithCancel(context.Background())
// 启动一个并发任务
go func(ctx context.Context) {
for {
select {
case <-ctx.Done():
// 当上下文取消时,退出循环
fmt.Println("任务被取消")
return
default:
// 模拟任务执行
fmt.Println("任务正在执行...")
time.Sleep(1 * time.Second)
}
}
}(ctx)
// 模拟一段时间后取消任务
time.Sleep(3 * time.Second)
cancel()
// 等待一段时间,确保任务有机会处理取消信号
time.Sleep(1 * time.Second)
}
context在并发匿名函数中的重要性:
- 取消控制:在复杂的并发程序中,能够取消某个正在运行的任务是非常重要的。通过传递上下文到匿名函数,外部可以通过取消上下文来通知匿名函数停止执行,从而优雅地结束任务,避免资源泄露等问题。
- 超时控制:使用
context.WithTimeout
可以设定任务的最长执行时间,当超过这个时间,上下文会自动取消,匿名函数可以感知到并停止执行,确保任务不会无限期运行。
- 跨层级传递信号:上下文可以在函数调用链中传递,即使在匿名函数深处,也能收到来自顶层的取消或超时信号,使得整个并发系统的控制更加统一和灵活。