导入包:
Go
import (
"sync"
)
1.初始化等待对象
Go
var wg = sync.WaitGroup{} //初始化协程等待对象
2.添加等待计算器
Go
wg.Add(1) //添加等待计数
3.协程中等待完成
Go
go func(id int) {
defer wg.Done() //延迟执行,当前函数执行完成后,执行该语句
fmt.Println("工作协程序已启动", id)
//time.Sleep(1 * time.Second)
fmt.Println("===工作协程序已完成===", id)
}(i + 1)
4.等待所有协程执行完成
Go
wg.Wait() //等待所有协程执行完成
5.完整示例
Go
dt1 := time.Now()
//使用WaitGroup等待多个协程执行完成
var wg = sync.WaitGroup{} //初始化协程等待对象
fmt.Println("===启动10个协程序===", dt1)
//启动10个协程序
for i := 0; i < 10; i++ {
wg.Add(1) //添加等待计数
go func(id int) {
defer wg.Done() //延迟执行,当前函数执行完成后,执行该语句
fmt.Println("工作协程序已启动", id)
//time.Sleep(1 * time.Second)
fmt.Println("===工作协程序已完成===", id)
}(i + 1)
}
wg.Wait() //等待所有协程执行完成
dt2 := time.Now()
fmt.Println("<<所有协程已执行完成>>", dt2)
dtRet := dt2.Sub(dt1)
aUnit := ""
fmt.Println(dtRet, "毫秒:", dtRet.Milliseconds(), "微秒:", dtRet.Microseconds(), "纳秒:", dtRet.Nanoseconds())
if (dtRet.Nanoseconds() / 1000) < 1000 {
aUnit = "微秒"
} else {
aUnit = "毫秒"
}
fmt.Println("10个协程执行完成花费时间:", dtRet, aUnit)
输出:
bash
===启动10个协程序=== 2024-06-07 15:53:22.4212564 +0800 CST m=+24.048319001
工作协程序已启动 8
===工作协程序已完成=== 8
工作协程序已启动 10
===工作协程序已完成=== 10
工作协程序已启动 6
===工作协程序已完成=== 6
工作协程序已启动 3
===工作协程序已完成=== 3
工作协程序已启动 7
===工作协程序已完成=== 7
工作协程序已启动 2
===工作协程序已完成=== 2
工作协程序已启动 4
===工作协程序已完成=== 4
工作协程序已启动 9
===工作协程序已完成=== 9
工作协程序已启动 5
===工作协程序已完成=== 5
工作协程序已启动 1
===工作协程序已完成=== 1
<<所有协程已执行完成>> 2024-06-07 15:53:22.4217875 +0800 CST m=+24.048850101
531.1µs 毫秒: 0 微秒: 531 纳秒: 531100
10个协程执行完成花费时间: 531.1µs 微秒