引言
Golang中通过go关键字就可开启一个goroutine,因此,在Go中可以轻松写出并发代码。但是,如何对这些并发执行的groutines有效地控制?
提到并发控制,很多人可能最先想到的是锁。Golang中同样提供了锁的相关机制,包括互斥锁sync.Mutex,和读写锁sync.RWMutex。除了锁,还有原子操作sync/atomic等。但是,这些机制关注的重点是goroutines的并发数据安全性。而本文想讨论的是goroutine的并发行为控制。
在goroutine并发行为控制中,有三种常见的方式,分别是WaitGroup、channel和Context。
WaitGroup
WaitGroup位于sync包下,它的使用方法如下。
func main() {
var wg sync.WaitGroup
wg.Add(2) //添加需要完成的工作量2
go func() {
wg.Done() //完成工作量1
fmt.Println("goroutine 1 完成工作!")
}()
go func() {
wg.Done() //完成工作量1
fmt.Println("goroutine 2 完成工作!")
}()
wg.Wait() //等待工作量2均完成
fmt.Println("所有的goroutine均已完成工作!")
}
输出