【Go - sync.WaitGroup】

wg.Add(delta int)sync.WaitGroup 类型的一个方法,用于设置或调整等待组中的计数器。参数 delta 表示要添加到等待组计数器的值,它可以是正数、负数或零。

参数含义

  • delta:
    • delta 为正数时,它增加等待组的计数器,通常表示有新的协程任务开始执行。
    • delta 为负数时,它减少等待组的计数器,表示一个或多个协程任务已经完成。
    • delta 为零时,实际上不会改变计数器的值,但通常不会这样使用。

具体用法

在启动一组协程之前,通过调用 wg.Add(n) 来设置等待组的计数器,其中 n 是即将并发执行的协程数量。每个协程在其执行结束前调用 wg.Done() 来减少等待组的计数器。wg.Done() 实际上是 wg.Add(-1) 的简便调用。主协程通过调用 wg.Wait() 阻塞,直到等待组的计数器减到零,即所有协程都已完成。

示例

var wg sync.WaitGroup

func worker(id int) {
    defer wg.Done() // 在结束时通知WaitGroup任务已完成
    fmt.Printf("Worker %d starting\\n", id)
    // 执行任务...
    fmt.Printf("Worker %d done\\n", id)
}

func main() {
    numWorkers := 5
    wg.Add(numWorkers) // 设置等待的协程数量

    for i := 1; i <= numWorkers; i++ {
        go worker(i) // 启动协程
    }

    wg.Wait() // 等待所有协程完成
    fmt.Println("All workers completed")
}

原理

sync.WaitGroup 内部维护一个计数器和一个等待队列。当计数器大于零时,wg.Wait() 会阻塞。当计数器为零时,wg.Wait() 不会阻塞,如果有协程因调用 wg.Wait() 而阻塞,它们会被唤醒。这使得 sync.WaitGroup 成为协调多个协程执行完成的理想选择。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值