欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > 【Go - sync.WaitGroup】

【Go - sync.WaitGroup】

2025/10/15 15:25:15 来源:https://blog.csdn.net/qq_38428433/article/details/140808957  浏览:    关键词:【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.WaitGroupfunc worker(id int) {defer wg.Done() // 在结束时通知WaitGroup任务已完成fmt.Printf("Worker %d starting\\n", id)// 执行任务...fmt.Printf("Worker %d done\\n", id)
}func main() {numWorkers := 5wg.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 成为协调多个协程执行完成的理想选择。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词