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 和常见并发模式,能帮助你写出高效且可靠的并发程序。