WaitGroup如何用于等待一组goroutine完成?

东白随记
0 评论
/ /
0 阅读
/
1479 字
08 2008-05

`sync.WaitGroup` 是 Go 语言中用于等待一组 goroutine 完成的标准库工具。你可以使用 `WaitGroup` 来同步你的代码,以确保当一组 goroutine 完成其任务后,再继续执行主 goroutine 的其他操作。

`WaitGroup` 的基本用法是:

1. 创建一个 `WaitGroup` 实例

2. 在每个 goroutine 开始时,调用 `Add(n)` 方法(n 通常为 1),以表示有新的 goroutine 正在开始执行

3. 在每个 goroutine 结束时,调用 `Done()` 方法,以表示该 goroutine 已经完成

4. 在主 goroutine 中,调用 `Wait()` 方法来等待所有 goroutine 完成

下面是一个简单的例子:

```go

package main

import (

"fmt"

"sync"

)

func doWork(wg *sync.WaitGroup, id int) {

defer wg.Done() // 在函数返回时自动调用 Done()

// 执行一些任务...

fmt.Printf("Goroutine %d is working...\n", id)

}

func main() {

var wg sync.WaitGroup // 创建一个新的 WaitGroup 实例

// 启动5个并行的 goroutine 来做工作...

for i := 1; i <= 5; i++ {

wg.Add(1) // 为每个新的 goroutine 增加计数器

go doWork(&wg, i) // 启动 goroutine 并传递 WaitGroup 和其他参数

}

// 主 goroutine 需要等待所有工作 goroutine 完成...

wg.Wait() // 阻塞主 goroutine,直到所有工作 goroutine 完成

fmt.Println("All goroutines have completed.") // 所有工作完成后输出信息...

}

```

在这个例子中,我们创建了一个 `WaitGroup` 并启动了5个并行的 goroutine。每个 goroutine 都调用了 `wg.Add(1)` 来增加计数器,并在完成时调用了 `wg.Done()` 来减少计数器。在主 goroutine 中,我们调用了 `wg.Wait()` 来等待所有工作 goroutine 的完成。当所有工作 goroutine 都调用了 `Done()` 方法后,`Wait()` 方法将不再阻塞主 goroutine,并且程序将输出 "All goroutines have completed."。