70、掌握Go语言sync.WaitGroup:轻松管理并发任务协作

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<

猜你喜欢

转载自blog.csdn.net/silenceallat/article/details/139955808