golang使用WaitGroup等待多个协程执行完成

导入包:

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 微秒
相关推荐
孙克旭_6 分钟前
JVM 入门详解:JVM、JRE、JDK 区别,JVM 基础结构梳理
java·开发语言·jvm
随遇而安zx9 分钟前
【地基篇】---JVM 内存结构知识点(Java 8 运行时数据区深度解析)
java·开发语言·jvm
GoGeekBaird19 分钟前
Agent 时代,你的生产环境,真的敢让它裸奔吗
后端·agent
FfHUCisI24 分钟前
Golang 切片扩容策略
开发语言·数据库·golang
IT_陈寒24 分钟前
Redis Pipeline用错竟比不用还慢,这个坑我帮你踩过了
前端·人工智能·后端
en.en..25 分钟前
Ubuntu嵌入式开发 export环境变量
java·开发语言·数据库
ynchyong37 分钟前
JavaScript Promise 实战:.then() 与 .catch() 的区别及回调函数封装指南
开发语言·javascript·ecmascript·promise·then
名字还没想好☜41 分钟前
Go 1.21 context.WithoutCancel 实战:父 context 取消了,收尾任务还要继续跑
开发语言·后端·golang·go
源代码•宸1 小时前
前置准备:定时微服务有什么价值
经验分享·后端·微服务·云原生·架构
wdfk_prog1 小时前
canopennode-rtt推荐,不只可以做从站,也可以承担主站角色
c语言·开发语言·数据库·学习·算法·深度优先