Go语言-->sync.WaitGroup 详细解释

sync.WaitGroup 详细解释

sync.WaitGroup 是 Go 语言中用于同步多个 goroutine 的完成的工具。它允许主 goroutine 等待所有子 goroutine 执行完毕后再继续。

核心概念

WaitGroup 内部维护一个计数器

  • Add(n): 计数器加 n(通常在启动 goroutine 前调用)
  • Done(): 计数器减 1(在 goroutine 完成时调用)
  • Wait(): 阻塞直到计数器变为 0

基本用法

go 复制代码
package main

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

func main() {
	var wg sync.WaitGroup

	// 添加 3 个 goroutine 到等待组
	wg.Add(3)

	// 启动第一个 goroutine
	go func() {
		defer wg.Done() // 完成时计数器 -1
		fmt.Println("任务 1 开始")
		time.Sleep(1 * time.Second)
		fmt.Println("任务 1 完成")
	}()

	// 启动第二个 goroutine
	go func() {
		defer wg.Done()
		fmt.Println("任务 2 开始")
		time.Sleep(2 * time.Second)
		fmt.Println("任务 2 完成")
	}()

	// 启动第三个 goroutine
	go func() {
		defer wg.Done()
		fmt.Println("任务 3 开始")
		time.Sleep(500 * time.Millisecond)
		fmt.Println("任务 3 完成")
	}()

	// 等待所有 goroutine 完成
	wg.Wait()
	fmt.Println("所有任务完成!")
}

输出

复制代码
任务 1 开始
任务 2 开始
任务 3 开始
任务 3 完成
任务 1 完成
任务 2 完成
所有任务完成!

关键特性

方法 说明
Add(n) 计数器加 n,必须在启动 goroutine 前调用
Done() 计数器减 1,通常用 defer 确保执行
Wait() 阻塞直到计数器为 0

常见模式

1. 批量处理任务

go 复制代码
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
	wg.Add(1)
	go func(id int) {
		defer wg.Done()
		// 处理任务
		fmt.Printf("处理任务 %d\n", id)
	}(i)
}
wg.Wait()

注意事项

⚠️ 常见错误

  • Add() 调用晚于 goroutine 启动
  • 忘记调用 Done()
  • Wait() 前计数器已为 0

最佳实践

  • 使用 defer wg.Done() 确保执行
  • 在启动 goroutine 前调用 Add()
  • 避免在 goroutine 中调用 Add()
相关推荐
Moment2 分钟前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
YUJIANYUE16 分钟前
PHP纹路验证码
开发语言·php
仟濹29 分钟前
【Java基础】多态 | 打卡day2
java·开发语言
孞㐑¥29 分钟前
算法——BFS
开发语言·c++·经验分享·笔记·算法
Re.不晚29 分钟前
JAVA进阶之路——无奖问答挑战2
java·开发语言
八零后琐话32 分钟前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
3GPP仿真实验室34 分钟前
【MATLAB源码】CORDIC-QR :基于Cordic硬件级矩阵QR分解
开发语言·matlab·矩阵
Cobyte1 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc
知南x1 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
忆~遂愿1 小时前
GE 引擎与算子版本控制:确保前向兼容性与图重写策略的稳定性
大数据·开发语言·docker