Go语言开发:WaitGroup:掌握sync.WaitGroup
的使用,等待一组Goroutine完成
在Go语言的并发编程中,sync.WaitGroup
是一个非常实用的同步机制,用于等待一组Goroutine的完成。本文将详细介绍sync.WaitGroup
的使用方法,并通过实例展示其在实际应用场景中的重要性。
1. WaitGroup简介
在介绍sync.WaitGroup
之前,我们先来理解一个概念:同步。在并发编程中,同步是指让多个Goroutine在某个时刻共同完成某个任务。而sync.WaitGroup
就是用来实现这一目标的。
想象一下,你和朋友约好一起去公园玩耍,你们约定在公园门口集合。当所有人都到齐后,你们一起进入公园。这里的“人到齐”就是一种同步,而“公园门口”就是你们的同步点。
2. sync.WaitGroup
的使用
sync.WaitGroup
是一个并发同步原语,它包含一个计数器,用于跟踪等待的Goroutine数量。当计数器的值为0时,表示所有Goroutine都已经完成任务,此时主Goroutine可以继续执行,而不再阻塞。
下面是一个简单的sync.WaitGroup
使用示例:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup // 创建一个WaitGroup实例
for i := 0; i < 3; i++ {
wg.Add(1) // 增加计数器
go func(i int) {
defer wg.Done() // 在函数结束时减少计数器
fmt.Printf("Goroutine %d is running\n", i)
time.Sleep(2 * time.Second)
fmt.Printf("Goroutine %d is done\n", i)
}(i)
}
wg.Wait() // 阻塞,直到计数器为0
fmt.Println("All goroutines have finished.")
}
在这个例子中,我们创建了一个sync.WaitGroup
实例,并启动了三个Goroutine。每个Goroutine在执行完毕后,都会调用wg.Done()
来减少计数器。主Goroutine在调用wg.Wait()
时会阻塞,直到所有Goroutine都完成任务,此时计数器为0,主Goroutine继续执行。
3. 应用场景
3.1 数据处理
假设我们要处理一个大数据文件,将其拆分成多个部分,然后分别对每个部分进行处理。这时,我们可以使用sync.WaitGroup
来确保所有数据处理完毕后再进行下一步操作。
package main
import (
"fmt"
"sync"
"time"
)
func main() {
file := "large_file.txt"
partCount := 10
var wg sync.WaitGroup
ch := make<