Go 并发编程的七种常见模式
Go 的 goroutine 和 channel 让并发编程变得简洁,但写出正确的并发代码仍然需要遵循一些经典模式。以下是过去一年里我使用最频繁的七种模式。
1. Pipeline
多个 goroutine 通过 channel 串联:上游输出作为下游输入。适合流式数据处理。
func gen(nums ...int) <-chan int {
out := make(chan int)
go func() {
for _, n := range nums { out <- n }
close(out)
}()
return out
}
2. Fan-out / Fan-in
多个 worker 从同一个 channel 读取(fan-out),结果汇聚到一个 channel(fan-in)。CPU 密集型任务的理想选择。
3. Worker Pool
使用固定数量的 worker goroutine 处理任务队列,控制并发度。搭配 sync.WaitGroup 等待所有 worker 完成。
4. Context 传递取消信号
使用 context.Context 在 goroutine 之间传递超时和取消信号,避免 goroutine 泄漏。
5. Select 多路复用
select 语句同时监听多个 channel,配合 time.After 实现超时控制。
6. Errgroup 并行错误处理
golang.org/x/sync/errgroup 提供一组 goroutine 的并行执行和错误收集,任何一个 goroutine 出错就取消其余。
7. 扇出限制
使用带缓冲 channel 作为信号量,限制同时运行的 goroutine 数量,避免资源耗尽。