go基础 - WaitGroup用法
package main
import (
"fmt"
"sync"
"time"
)
/**
* Created by Goland
* User: wkk [email protected]
* Time: 2022/8/15 - 23:33
* Desc: <描述信息>
*/
func main() {
fmt.Println("主线程 start。。")
// 1、协程练习
//goroutineTest()
// 2、协程执行结束,主线程再结束,需要用到 WaitGroup
var wg sync.WaitGroup // 定义一个wg
waitGroupTest(&wg)
wg.Wait() // 阻塞状态,直到所有的协程执行完成,然后再继续执行主线程
fmt.Println("主线程 end。。")
}
/*------------------------ goroutine start ---------------------------*/
func goroutineTest() {
fmt.Println("协程练习 start...")
// 开启1000个协程
for i := 0; i < 1000; i++ {
// 匿名函数,闭包
//go func(i int) {
// fmt.Printf("打印数字:%d\n", i)
//}(i)
// 调用方法
go P(i)
}
// sleep2秒,保证协程全部执行完成,再执行主线程
time.Sleep(2 * time.Second) // 如果没有这个,可能会主线程执行结束退出,开启的协程也自动退出
fmt.Println("协程练习 end...")
}
func P(i int) {
fmt.Printf("打印数字:%d\n", i)
}
/*------------------------ goroutine end ---------------------------*/
/*------------------------ waitGroup start ---------------------------*/
/**
Add(n int) :每次开启协程前调用该方法,计数器+1
Done() :协程每次执行完成后调用该方法,计数器-1
Wait() : 主线程中调用该方法,使得主线程等待中,阻塞主线程执行,直到所有线程全部执行完成,计数器 = 0,然后不再阻塞主线程
*/
func waitGroupTest(wg *sync.WaitGroup) {
for i := 0; i < 10000; i++ {
// 每次新开启goroutine,先add 加 1
wg.Add(1)
go wp(i, wg)
}
}
func wp(i int, wg *sync.WaitGroup) {
// 每次执行完协程中的任务,执行done方法,表示执行完成
defer wg.Done() // 防止漏写Done方法,可以通过defer写在前边,在执行完之后及时Done
fmt.Printf("打印数字:%d\n", i)
}
/*------------------------ waitGroup end ---------------------------*/
标签:wg,WaitGroup,协程,fmt,主线,用法,go
From: https://www.cnblogs.com/alisleepy/p/16590175.html