Golang中的WaitGroup是用来让当前goroutine等待其他多个goroutine执行完成后,自己再继续后续执行。
举例来说,就好比一个一个团队10个人,同时没人完成一项任务,每一个人完成了自己的任务,就到领导那报道,最终只有10个人都完成了任务,都到领导那报道,这个任务才算最终完成。
这其中每来一个人报道,相当于一个人完成了了任务,领导那里就将倒数的任务减1,对应的代码的方法就是Done(),声明一共有多少任务的代码方法是Add(任务数)
我们来看具体代码:
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
runtime.GOMAXPROCS(runtime.NumCPU())
go func() {
defer wg.Done()
for i:=0; i<3; i++ {
for char :='a'; char<'a'+26; char++ {
fmt.Printf("%c", char)
}
time.Sleep(1000)
fmt.Println()
}
}()
go func() {
defer wg.Done()
for i:=0; i<3; i++ {
for char:='A';char<'A'+26;char++ {
fmt.Printf("%c ", char)
}
time.Sleep(1000)
fmt.Println()
}
}()
wg.Wait()
}
声明任务数的就是这两行代码:
var wg sync.WaitGroup
wg.Add(2)
这里声明了要等待两个goroutine
在每个go func()方法开头都有一行代码:
defer wg.Done()
这就是上面说到的,各自完成任务的报道操作,每执行一次wg.Done(),计数要等到的goroutine的数量就减少一个,等到减为0,那么当前goroutine就没有要等待的其他goroutine,就会继续执行自己的代码,或者结束任务。
当然,还需要一个动作,就是当前goroutine的等待操作,代码中的最后一行有声明:
wg.Wait()