Go 服务中 Context 取消信号为何没生效:从一次 goroutine 泄漏排查说起
线上一个 Go 写的订单同步服务运行几天后内存缓慢上涨,pprof 显示大量 goroutine 卡在 chan receive,追溯到 context.WithTimeout 创建的 ctx 已经过期,但下游 goroutine 仍没退出。这个场景在 Go 项目里很常见:父 ctx 取消后,子 goroutine 因为只检查了 ctx.Done() 却继续阻塞在无缓冲 channel 发送、time.Sleep 或第三方库调用上,取消信号形同虚设。Context 的设计是协作式的,它不会主动杀死 goro...