【go语言系列】sync.WaitGroup
创始人
2025-05-31 21:31:33

文章目录

    • 说明
    • demo
    • 参考

author: ningan123
date: 2023-03-21 11:05
updated: 2023-03-21 11:09

说明

官方文档对 WaitGroup 的描述是:一个 WaitGroup 对象可以等待一组协程结束。使用方法是:

  1. main 协程通过调用 wg.Add(delta int) 设置 worker 协程的个数,然后创建 worker 协程;
  2. worker 协程执行结束以后,都要调用 wg.Done()
  3. main 协程调用 wg.Wait() 且被 block,直到所有 worker 协程全部执行结束后返回。

demo

举一个例子来说明这个问题

下面三个小demo可以实现同样的功能,但是下一个都比上一个更加的优雅

package mainimport ("fmt""sync"
)// // 方法1
// func main() {
// 	for i := 0; i < 100; i++ {
// 		go fmt.Println(i)
// 	}
// 	time.Sleep(time.Second)
// }// // 方法2
// func main() {
// 	num := 100
// 	c := make(chan bool, num)
// 	for i := 0; i < num; i++ {
// 		go func(i int) {
// 			fmt.Println(i)
// 			c <- true
// 		}(i)
// 	}// 	for i := 0; i < num; i++ {
// 		<-c
// 	}
// }// 方法3
func main() {wg := sync.WaitGroup{}num := 20wg.Add(num)for i := 0; i < num; i++ {go func(i int) {// wg.Done()  // 放这会有问题fmt.Println(i)// wg.Done()}(i)}wg.Wait()
}

对于方法3来说,wg.Done()要放在写成结束之后,否则就会有问题

当wg.Done()放在位置1处,如下为两次运行代码的结果。可以看到,很可能在协程还没有开始运行,主进程就结束了

############## wg.Done()放在位置1处 ##############
# go run main.go
9
2
0
# go run main.go
9
0
1
2
3
4
5
6
7
8

wg.Done()放在位置2处就没有问题了,每次当协程运行结束之后才将waitGroup中的协程减1,就不会有影响了~

参考

# Golang sync.WaitGroup的用法
sync.WaitGroup 详解

相关内容

热门资讯

血管堵不堵 看脸和腿就知道?6... 血管不好的人从脸上、腿上就能看出来?有这6个症状的人一定要提高警惕01脸上出现这3个症状警惕血管堵塞...
揪心!孙颖莎终于被密集赛程累垮... (来源:上观新闻)12月13日,2025年WTT香港总决赛女单半决赛的赛场,出现令人揪心的一幕。球迷...
让传统艺术焕发时代光彩 许维东 于冰雁 采茶戏是流行于中国南方的一种传统戏曲类别。采茶戏作为国家级非物质文化遗产,既是承载江...
甘肃新能源年发电量首次突破90... 制图:石代学 本报讯(新甘肃·甘肃日报记者王占东)记者从国网甘肃省电力公司获悉,截至12月12日零时...
女单因伤退赛,混双带伤出战携王... (来源:上观新闻)休养蓄力,方能再战征程。昨晚,孙颖莎与王楚钦搭档斩获混双银牌,就此结束本次WTT香...