WaitGroup使用

232 阅读1分钟

前言

在go中,如果使用go跑异步的话,会发现,当main函数执行完时,go修饰的方法也跟着结束了,所以go提供了sync.WaitGroup来实现等待唤醒

方法说明

sync.WaitGroup提供了Add,Done,Wait等几个方法,add方法用于往计数器+1,Done类似于计数-1,wait()用于等待计数器变为0才往下执行

go关键字修饰方法

package main

import (
   "fmt"
   "time"
)

func main() {
   go say()
   fmt.Println(13)
}

func say() {
   time.Sleep(5 * time.Second)
   fmt.Println(12)
}

这段程序会发发现,当main方法执行结束时,say()方法就不执行了,也就是不输出了,但是如果要让方法输出的话,可以使用休眠,程序如下

package main

import (
   "fmt"
   "time"
)

func main() {
   go say()
   fmt.Println(13)
}

func say() {
   time.Sleep(5 * time.Second)
   fmt.Println(12)
}

但是总不可能使用休眠的方法使方法输出

sync.WaitGroup使用


package main

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

var wg sync.WaitGroup

func main() {
	wg.Add(1)
	go say()
	wg.Wait()
	fmt.Println("执行结束")
}

func say() {
	defer wg.Done()
	fmt.Println(12)
	time.Sleep(5 * time.Second)
	fmt.Println(14)
}


总结

sync.WaitGroup可以实现异步方法的等待唤醒,通过调用Wait()来等待并发任务执行完,当计数器值为0时,表示所有并发任务已经完成。