目录
- WaitGroup介绍
- WaitGroup的实现
- Add
- Done
- Wait
WaitGroup介绍
waitGroup
,也是在go语言并发中比较常用的语法,所以在这里我们一起剖析 waitGroup 的使用方式及其源码解读。
WaitGroup
也是sync 包下一份子,用来解决任务编排的一个并发原语。它主要解决了并发-等待问题:比如现在有三个goroutine
,分别为goroutineA
,goroutineB
,goroutineC
,而goroutineA
需要等待goroutineB
和goroutineC
这一组goroutine全部执行完毕后,才可以执行后续业务逻辑。此时就可以使用 WaitGroup
轻松解决。
在这个场景中,goroutineA
为主goroutine,goroutineB
和goroutineC
为子goroutine。goroutineA
则需要在检查点(checkout point) 等待goroutineB
和goroutineC
全部执行完毕,如果在执行任务的goroutine
还没全部完成,那么goroutineA
就会阻塞在检查点,直到所有goroutine
都完成后才能继续执行。
代码实现:
package main
import (
"fmt"
"sync"
)
func goroutineB(wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("goroutineB Execute")
time.Sleep(time.Second)
}
func goroutineC(wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("goroutineC Execute")
time.Sleep(time.Second)
}
func main() {
var wg sync.WaitGroup
wg.Add(2