用途:帮助在 Go 服务中安全地组织并发,明确 goroutine 生命周期、用 context.Context 传播取消,并保护共享状态,避免 goroutine 泄漏、死锁与数据竞态。
主要能力:
- 基础构件:用 context 驱动取消与超时;用 errgroup.WithContext 实现扇出/扇入并在任一任务出错时提前中止;用信号量或工作池限制并发数;共享状态用互斥锁保护,或由单一 goroutine 独占。
- 常见模式:errgroup 取消兄弟任务;信号量式有界并发;固定工作数的 worker pool;管道阶段(仅发送方关闭 channel);用 time.NewTicker 做周期性任务以避免泄漏。
- 选型建议:需要所有权/串行化用 channel,读写共享缓存用 RWMutex,低竞争计数用 atomic;需要错误传播与兄弟取消用 errgroup,仅等待用 sync.WaitGroup;需背压用无缓冲 channel,吸收突增用有缓冲。
- 测试与排查:用竞态检测器运行测试:go test -race ./...;调试时禁用缓存:go test -run TestName -race -count=1 ./...。用 context.WithTimeout 为测试设置超时。
反模式:请求处理器中 fire-and-forget goroutine;热循环里用 time.After;接收方关闭 channel;无同步地跨 goroutine 共享可变变量;忽略调用方 context 而使用 context.Background()。
适用场景:生产 Go 微服务与后台任务中需要并发处理、限流、取消与稳定吞吐的场合。
限制:资料为模式与示例说明,未提供具体版本兼容性、性能基准或完整可运行项目;实际采用需自行验证。