📅  最后修改于: 2023-12-03 15:07:53.195000             🧑  作者: Mango
在编写并发程序时,经常需要等待所有 goroutine 完成后再继续执行下一步操作。Go 语言的 sync.WaitGroup
可以帮助我们达到这个目的。
WaitGroup 可以用来等待一组 goroutine 完成它们的工作。当你启动了一组 goroutine 时,你可以调用 Add(n int)
方法来增加计数器的值,表示有 n 个 goroutine 需要完成。当每个 goroutine 完成工作时,可以调用 Done()
方法来减少计数器的值。当计数器的值变为 0 时,Wait()
方法将立即返回,表示所有 goroutine 都已经完成。
这里我们来看一个例子,它使用 WaitGroup 来等待一组 goroutine 完成:
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 减少计数器的值
fmt.Printf("Worker %d starting\n", id)
// 等待某些事情完成…
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup // 声明 WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // 增加计数器的值
go worker(i, &wg)
}
wg.Wait() // 等待所有 goroutine 完成
fmt.Println("All workers done.")
}
在上面的例子中,我们声明了一个 WaitGroup,然后在 for 循环内将计数器的值增加,指示有五个 goroutine 需要完成。然后,在每个 goroutine 中,我们调用了 wg.Done()
来减少计数器的值,表示这个 goroutine 已经完成了它的工作。最后,我们在 main
函数中调用了 wg.Wait()
,它会一直阻塞,直到计数器的值变为 0,表示所有 goroutine 都已经完成。
输出应该类似于:
Worker 1 starting
Worker 5 starting
Worker 4 starting
Worker 2 starting
Worker 3 starting
Worker 5 done
Worker 1 done
Worker 4 done
Worker 2 done
Worker 3 done
All workers done.
WaitGroup 可以确保一组 goroutine 都已经完成它们的工作后再开始执行下一步操作。它是 Go 语言中一个简单而强大的并发工具,可以帮助您写出更高效、更可靠的并发程序。