当前位置:首页 >专题 >Go 并发治理实战

Go 并发治理实战
Go 并发治理

Go 并发治理实战

这个专题面向已经写过 Go 服务、但在并发代码稳定性上遇到过 panic、泄漏、超时失控或数据竞争的开发者。

学习路径

从并发模型到生产验证

Effective Go: Concurrency
外链

Effective Go: Concurrency

Go 官方对 goroutine、channel 和通信式并发风格的基础说明。
Go Concurrency Patterns: Pipelines and cancellation
外链

Go Concurrency Patterns: Pipelines and cancellation

Go 官方博客用 pipeline 案例解释多阶段并发、关闭信号和取消传播。
Package context
外链

Package context

context 包用于在请求链路和 goroutine 间传递取消、超时和截止时间。
Package sync
外链

Package sync

sync 包提供 Mutex、RWMutex、WaitGroup、Once、Cond、Map 等同步工具。
Go map 并发读写为什么会 panic:锁、sync.Map 和 channel 单写怎么选
文章

Go map 并发读写为什么会 panic:锁、sync.Map 和 channel 单写怎么选

用真实共享 map 场景解释 panic 原因,并给出锁、sync.Map 和 channel 单写模型的选型路径。
Package errgroup
外链

Package errgroup

errgroup 提供 goroutine 组、错误返回和基于 context 的取消协作。
Data Race Detector
外链

Data Race Detector

Go 官方数据竞争检测工具说明,介绍如何用 -race 发现并发读写问题。

落地检查清单

上线前逐项复查

goroutine 是否有退出条件
问答

goroutine 是否有退出条件

检查后台任务、请求协程和 pipeline worker 是否会在请求取消、超时或通道关闭后退出。
共享变量是否只有一种保护方式
问答

共享变量是否只有一种保护方式

同一个状态不要一部分用锁、一部分裸读写、一部分走 channel,否则很难证明安全。
并发路径是否跑过 go test -race
问答

并发路径是否跑过 go test -race

把数据竞争检测放进测试流程,避免线上出现偶发错误后再补验证。

常见问题

并发治理容易混淆的几个点

Go 并发学习应该先看 goroutine 还是 channel?

建议先理解 goroutine 的生命周期,再学习 channel 的通信和关闭语义。真正写业务代码时,还要把 context、错误返回和退出条件一起设计。

sync.Map 能不能替代所有加锁 map?

不能。sync.Map 适合特定读多写少、键集合相对稳定或缓存型场景。普通业务状态通常应先根据读写比例、顺序要求和类型安全选择 Mutex、RWMutex、channel 单写或 sync.Map。

WaitGroup 和 errgroup 怎么选?

只需要等待多个 goroutine 完成时可以用 WaitGroup;如果要收敛错误、任一任务失败后取消其他任务,errgroup 通常更合适。

go test -race 可以发现所有并发问题吗?

不能。race detector 能发现运行路径上的数据竞争,但发现不了没有覆盖到的路径,也不能替代超时、泄漏、死锁和业务一致性测试。

微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码