sync.WaitGroup

sync.WaitGroup结构体 #

用途:等待多个goroutine执行完成再继续往下执行,启动阻塞作用。
结构体支持的方法如下:
func (wg *WaitGroup) Add(delta int) 计数器加1,该方法在执行goroutine前执行
func (wg *WaitGroup) Done() 计数器减1,该方法在方法执行完放在defer中调用
func (wg *WaitGroup) Wait() 阻塞,等待计数器归0再继续执行后续代码

示例1 #

package main

import (
	"fmt"
	"sync"
	"time"
)

func worker(id int, wg *sync.WaitGroup) {
	//方法执行完计数器加1
	defer wg.Done()

	fmt.Printf("开始执行 %d \n", id)
	time.Sleep(time.Second)
	fmt.Printf("睡眠后执行的 %d \n", id)
}

func main() {
	//定义结构体变量
	var wg01 sync.WaitGroup
	for i := 1; i <= 5; i++ {
		wg01.Add(1) //启动goroutine前计数器加1
		//开启goroutine执行
		go worker(i, &wg01)
	}
	//等待计数器中的goroutine都执行完成才继续向后执行,阻塞
	wg01.Wait()
	fmt.Println("main end")
}


执行结果样例如下:
开始执行 5 
开始执行 1 
开始执行 3 
开始执行 4 
开始执行 2 
睡眠后执行的 4 
睡眠后执行的 2 
睡眠后执行的 1 
睡眠后执行的 3 
睡眠后执行的 5 
main end
Build by Loppo 0.6.15