ZBLOG

sync.WaitGroup

sync.WaitGroup 是 Go 语言标准库 sync 包提供的一个并发原语,用于等待一组 goroutine 完成任务。它通常用于主 goroutine 阻塞等待其他多个子 goroutine 执行完毕的场景。


核心方法

  1. Add(delta int)

    • 设置需要等待的 goroutine 数量(计数器增加 delta)。
    • 必须在启动 goroutine 调用(通常在主协程中调用)。
  2. Done()

    • 表示一个 goroutine 完成(计数器减 1)。
    • 在每个子 goroutine 退出前调用(通常用 defer 确保执行)。
  3. Wait()

    • 阻塞当前 goroutine,直到计数器归零。
    • 一般在主协程中调用。

使用示例

package main

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

func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // goroutine结束时通知WaitGroup
	fmt.Printf("Worker %d starting\n", id)
	time.Sleep(time.Second) // 模拟耗时任务
	fmt.Printf("Worker %d done\n", id)
}

func main() {
	var wg sync.WaitGroup

	for i := 1; i <= 3; i++ {
		wg.Add(1) // 每启动一个goroutine,计数器加1
		go worker(i, &wg)
	}

	wg.Wait() // 阻塞直到所有goroutine完成
	fmt.Println("All workers completed")
}

关键注意事项

  1. 指针传递
    WaitGroup必须通过指针传递给goroutine(值传递会导致副本失效)。

  2. Add与Done的平衡
    如果 Add 的累计值不等于实际调用的 Done次数,会导致死锁或 panic。

  3. 不可复用
    一个 WaitGroup在调用 Wait()后不能重复使用(需重新创建)。

  4. 错误处理
    如果某个goroutine可能出错退出,需确保 Done()被调用(例如结合 defer+recover)。


适用场景

  • 批量异步任务的同步等待。
  • 替代简单的 channel+select同步逻辑。
  • (注意:复杂依赖关系建议用更高级的并发模型如 errgroup

如果需要更复杂的控制(如超时、错误传递),可以结合 context.Context或第三方库(如errgroup)。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24034

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?