【源码解剖】Go任务编排助手sync.WaitGroup
sync.WaitGroup
是 Go 语言标准库中的一个同步原语,用于等待一组 goroutine 执行完毕。
以下是 sync.WaitGroup
的核心方法:
Add(delta int)
: 增加或减少等待的 goroutine 数量。Done()
: 等同于Add(-1)
,表示一个 goroutine 执行完毕。Wait()
: 阻塞直到Add
操作减到零,意味着所有 goroutine 都执行完毕。
下面是一个使用 sync.WaitGroup
的例子:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 确保 wg.Add 操作数量最终会减少
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 <= 5; i++ {
wg.Add(1) // 为每一个 worker 增加一个等待计数
go worker(i, &wg) // 启动一个 goroutine
}
wg.Wait() // 等待所有 worker 完成
fmt.Println("All workers have finished")
}
在这个例子中,我们启动了五个 goroutine 来执行 worker 函数,每个 worker 函数执行前后都会打印信息。sync.WaitGroup
用于同步这五个 goroutine 的执行。main
函数中的 wg.Wait()
会阻塞,直到所有 goroutine 完成工作,此时所有的 wg.Add(1)
操作都已经通过 defer wg.Done()
操作被抵消了。
评论已关闭