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
成为协调多个协程执行完成的理想选择。
网友评论