欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Go 语言并发陷阱:Goroutine 泄漏检测与 Context 取消传播

发表于:|最后更新:|分类:系统编程|阅读:4987 次

Goroutine 泄漏是 Go 服务内存持续增长的常见根因:启动的协程因阻塞在 channel 发送/接收或无限循环中永不退出。通过 context.Context 的取消信号传播,配合 select 监听 ctx.Done(),可确保协程树级联退出。

一、Context 取消与 select 退出模式

go
func worker(ctx context.Context, jobs <-chan Job) {
    for {
        select {
        case <-ctx.Done():
            // 收到取消信号,立即退出,避免 Goroutine 泄漏
            return
        case job, ok := <-jobs:
            if !ok {
                return
            }
            process(job)
        }
    }
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()
    go worker(ctx, jobs)
}