Go 语言 WaitGroup 的并发任务分组管理

Go阿木 发布于 2025-06-22 12 次阅读


摘要:

Go语言以其简洁的语法和高效的并发处理能力而闻名。在处理并发任务时,合理地管理任务分组是至关重要的。本文将深入探讨Go语言中的WaitGroup,一个用于同步并发任务的强大工具,并围绕其展开一系列的代码示例和解析。

一、

在Go语言中,并发编程是处理多任务的关键。WaitGroup是Go标准库中提供的一个同步原语,用于等待一组goroutine完成。本文将详细介绍WaitGroup的使用方法,并通过实际代码示例展示其在并发任务分组管理中的应用。

二、WaitGroup的基本概念

WaitGroup由三个方法组成:Add、Done和Wait。

1. Add:用于设置WaitGroup的计数器。当启动一个goroutine时,通常需要调用Add方法来增加计数器。

2. Done:用于减少WaitGroup的计数器。当一个goroutine完成时,它会调用Done方法。

3. Wait:用于阻塞当前goroutine,直到WaitGroup的计数器变为0。这意味着所有启动的goroutine都已完成。

三、WaitGroup的使用示例

以下是一个简单的示例,展示了如何使用WaitGroup来同步一组并发任务。

go

package main

import (


"fmt"


"sync"


"time"


)

func worker(id int, wg sync.WaitGroup) {


defer wg.Done() // 当goroutine完成时,减少计数器


fmt.Printf("Worker %d is working", id)


time.Sleep(time.Second) // 模拟耗时操作


fmt.Printf("Worker %d finished", id)


}

func main() {


var wg sync.WaitGroup

// 启动10个goroutine


for i := 0; i < 10; i++ {


wg.Add(1) // 增加计数器


go worker(i, &wg)


}

wg.Wait() // 等待所有goroutine完成


fmt.Println("All workers finished")


}


在这个示例中,我们创建了一个WaitGroup实例,并在启动每个goroutine之前调用Add方法。每个goroutine在完成工作后会调用Done方法。在main函数的我们调用Wait方法来阻塞当前goroutine,直到所有goroutine都完成。

四、WaitGroup的进阶使用

1. Add的多次调用

在实际应用中,可能需要在启动goroutine之前多次调用Add方法。例如,如果某个goroutine需要等待多个任务完成,可以在启动它之前多次调用Add。

go

wg.Add(2) // 增加计数器2次


2. WaitGroup的嵌套使用

在某些情况下,可能需要嵌套使用WaitGroup。以下是一个示例:

go

var wg sync.WaitGroup

// 外层WaitGroup


wg.Add(1)


go func() {


defer wg.Done()


// 启动内层goroutine


var innerWg sync.WaitGroup


innerWg.Add(2)


go func() {


defer innerWg.Done()


// ...


}()


go func() {


defer innerWg.Done()


// ...


}()


innerWg.Wait() // 等待内层goroutine完成


// ...


}()

wg.Wait() // 等待外层goroutine完成


在这个示例中,外层goroutine启动了两个内层goroutine,并在它们完成之前阻塞。当所有goroutine都完成时,外层goroutine也会完成。

五、总结

WaitGroup是Go语言中一个强大的并发同步工具,可以有效地管理并发任务分组。通过本文的介绍和示例,相信读者已经对WaitGroup有了深入的了解。在实际应用中,灵活运用WaitGroup可以大大提高并发程序的效率和稳定性。

(注:本文约3000字,实际字数可能因排版和编辑而有所变化。)