Golang 并发 WaitGroup

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()