Go 并发编程的七种常见模式

· #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 数量,避免资源耗尽。