Context 基础概念
Context 的核心作用
- 取消传播:在调用链中传递取消信号
- 超时控制:设置操作的截止时间
- 值传递:在调用链中安全传递请求范围数据
- 截止时间:设置操作的绝对过期时间点
创建 Context 的四种方式
// 1. 创建根Context |
Context 的五大核心应用场景
请求取消传播
场景:当用户取消操作时,中断整个调用链
func handleRequest(ctx context.Context) { |
超时控制
场景:确保操作在指定时间内完成
func fetchWithTimeout(url string) (string, error) { |
服务间传递元数据
场景:在微服务架构中传递请求ID、认证信息等
type contextKey string |
分布式追踪
场景:跨服务传递追踪信息
func callDownstreamService(ctx context.Context, serviceURL string) { |
资源清理协调
场景:确保所有相关资源在取消时被清理
func processTask(ctx context.Context) error { |
Context 的高级用法
组合多个 Context
func combineContexts(parent context.Context, timeout time.Duration) context.Context { |
Context 树管理
type ContextTree struct { |
自定义 Context 实现
type customContext struct { |
Context 的最佳实践
Context 使用原则
作为第一个参数:Context 应该是函数的第一个参数
func DoSomething(ctx context.Context, arg1, arg2 string) error
不存储 Context:避免在结构体中存储 Context
// 错误方式
type Server struct {
ctx context.Context
}
// 正确方式
func (s *Server) HandleRequest(ctx context.Context) {...}传递派生 Context:使用
WithCancel
,WithTimeout
等派生新 Contextfunc Process(ctx context.Context) {
childCtx, cancel := context.WithTimeout(ctx, 2*time.Second)
defer cancel()
// 使用 childCtx
}及时取消:使用
defer cancel()
确保资源释放ctx, cancel := context.WithCancel(context.Background())
defer cancel() // 确保函数返回时取消
Context 与并发模式
工作池模式
func workerPool(ctx context.Context, numWorkers int) { |
扇出/扇入模式
func processPipeline(ctx context.Context, input <-chan Data) <-chan Result { |
Context 陷阱与避免
陷阱1:未检查 Done()
// 错误方式:可能阻塞 |
陷阱2:Value 类型安全
// 错误方式:直接类型断言 |
陷阱3:过度使用 Value
// 错误方式:传递业务参数 |
Context 在不同领域的应用
HTTP 服务
func main() { |
gRPC 服务
type server struct { |
数据库操作
type Database struct { |
分布式任务调度
type TaskScheduler struct { |
Context 性能优化
减少 Context 创建
// 优化前:每次请求创建新Context |
高效值存储
type contextKey struct{} |
避免深层 Context 链
// 创建扁平Context而不是深层嵌套 |
Context 池化
type ContextPool struct { |