Golang并发编程——sync包详解
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func worker(id int, w *sync.WaitGroup) {
defer w.Done() // 在函数退出时,通知WaitGroup一个goroutine已经结束
fmt.Printf("Worker %d starting\n", id)
wg.Add(1) // 在worker函数内部,增加WaitGroup的计数
go worker(id+1, &wg) // 启动一个新的goroutine,递归调用worker函数
fmt.Printf("Worker %d done\n", id)
}
func main() {
wg.Add(1) // 在主goroutine中,增加WaitGroup的计数
go worker(1, &wg) // 启动一个新的goroutine,调用worker函数
wg.Wait() // 等待所有goroutine完成
}
这段代码使用了sync.WaitGroup
来确保主goroutine等待所有的worker goroutine完成其工作。每个worker goroutine在开始和结束时都通过调用wg.Add(1)
和defer wg.Done()
来更新WaitGroup的计数。递归地调用worker函数以创建一个goroutine树,每个节点都在其子节点完成之前结束。这是一个教育性的例子,展示了如何使用sync.WaitGroup
来管理并发。
评论已关闭