返回
深入浅出 Go 并发编程之 WaitGroup
后端
2023-11-07 20:02:13
WaitGroup 的使用场景
WaitGroup 可以用于各种场景,包括:
- 等待一组任务完成 :例如,您可以使用 WaitGroup 来等待一组 goroutine 将数据处理完毕,然后再进行下一步操作。
- 控制并发的数量 :您可以使用 WaitGroup 来控制同时运行的 goroutine 数量,防止系统资源被耗尽。
- 实现互斥锁 :您可以使用 WaitGroup 来实现互斥锁,确保同一时间只有一个 goroutine 能够访问共享资源。
WaitGroup 的使用方法
要使用 WaitGroup,您需要先创建一个 WaitGroup 实例,然后调用 Add 方法来设置需要等待的 goroutine 数量。每个 goroutine 完成工作后,需要调用 Done 方法来通知 WaitGroup。当所有 goroutine 都调用了 Done 方法后,WaitGroup 会自动唤醒主 goroutine。
以下是 WaitGroup 的使用方法示例:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println(i)
time.Sleep(time.Second)
}(i)
}
wg.Wait()
fmt.Println("All goroutines are finished.")
}
在这个示例中,我们创建了一个 WaitGroup 实例并设置需要等待的 goroutine 数量为 10。然后,我们创建了 10 个 goroutine,每个 goroutine 都调用了 wg.Add(1) 方法来通知 WaitGroup 需要等待自己完成工作。每个 goroutine 完成工作后,都会调用 wg.Done() 方法来通知 WaitGroup 自己已经完成工作。主 goroutine 调用 wg.Wait() 方法来等待所有 goroutine 完成工作,然后打印出 "All goroutines are finished."。
WaitGroup 的注意事项
在使用 WaitGroup 时,需要注意以下几点:
- WaitGroup 只能用于等待 goroutine,不能用于等待其他类型的并发任务,如通道或定时器。
- WaitGroup 的 Add 方法必须在所有 goroutine 启动之前调用,否则可能会导致 WaitGroup 无法正确工作。
- WaitGroup 的 Done 方法必须在每个 goroutine 完成工作后调用,否则可能会导致 WaitGroup 无法正确工作。
- WaitGroup 的 Wait 方法会阻塞主 goroutine,直到所有 goroutine 都调用了 Done 方法。因此,如果您不想阻塞主 goroutine,可以使用通道或其他同步机制来替代 WaitGroup。