Go 后端 并发

Go 语言并发模式详解

深入理解 Go 语言的 goroutine、channel 和常见的并发设计模式。

Go 语言的并发模型是其最引人注目的特性之一。goroutine 和 channel 使得编写并发程序变得简单而优雅。

Goroutine

goroutine 是 Go 中轻量级的执行单元:

func main() {
    go func() {
        fmt.Println("Hello from goroutine!")
    }()
    time.Sleep(time.Second)
}

Channel

channel 是 goroutine 之间通信的桥梁:

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        results <- j * 2
    }
}

常见并发模式

Fan-Out / Fan-In

将任务分发给多个 worker,然后收集结果:

func fanOut(input <-chan int, workers int) []<-chan int {
    channels := make([]<-chan int, workers)
    for i := 0; i < workers; i++ {
        channels[i] = worker(input)
    }
    return channels
}

Pipeline

将多个处理阶段串联起来:

func pipeline() {
    numbers := generate(2, 3, 4)
    squared := transform(numbers, func(n int) int { return n * n })
    for result := range squared {
        fmt.Println(result)
    }
}

避免常见陷阱

  • 避免 goroutine 泄漏
  • 注意 channel 死锁
  • 使用 context 进行取消操作
  • sync.WaitGroup 等待 goroutine 完成

总结

Go 的并发原语简洁而强大。掌握 goroutine、channel 和常见并发模式,能帮助你写出高效且可靠的并发程序。