技术文摘
Go 语言中 sync.WaitGroup 的使用示例
Go 语言中 sync.WaitGroup 的使用示例
在 Go 语言的并发编程中,sync.WaitGroup 是一个非常实用的工具,用于等待一组 goroutine 完成执行。
让我们来了解一下 sync.WaitGroup 的基本结构。它主要包含三个方法:Add 用于增加等待的 goroutine 数量,Done 用于标记一个 goroutine 完成,Wait 用于阻塞直到所有的 goroutine 都完成。
下面是一个简单的示例,展示了如何使用 sync.WaitGroup 来等待多个 goroutine 完成任务。
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("Worker %d is working...\n", id)
time.Sleep(2 * time.Second)
fmt.Printf("Worker %d completed\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println("All workers completed")
}
在上述示例中,我们在 main 函数中创建了一个 sync.WaitGroup 对象 wg。然后通过一个循环启动了 5 个 goroutine 去执行 worker 函数。在每个 worker 函数中,首先使用 defer wg.Done() 来确保在函数结束时通知 WaitGroup 自己已经完成。
在启动 goroutine 之前,使用 wg.Add(1) 增加等待的数量。最后,通过 wg.Wait() 阻塞主线程,直到所有的 goroutine 都完成。
sync.WaitGroup 使得我们能够有效地协调多个 goroutine 的执行,确保在所有并发任务完成后再进行后续的操作,提高了程序的可靠性和稳定性。
再来看一个稍微复杂一点的示例,假设有多个不同类型的任务需要并发执行,并且每个任务的执行时间不同。
package main
import (
"fmt"
"sync"
"time"
)
func task1(wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("Task 1 started")
time.Sleep(3 * time.Second)
fmt.Println("Task 1 completed")
}
func task2(wg *sync.WaitGroup) {
defer wg.Done()
fmt.Println("Task 2 started")
time.Sleep(5 * time.Second)
fmt.Println("Task 2 completed")
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go task1(&wg)
go task2(&wg)
wg.Wait()
fmt.Println("All tasks completed")
}
在这个例子中,同样使用 sync.WaitGroup 来等待两个不同的任务完成。
sync.WaitGroup 为 Go 语言的并发编程提供了一种简单而有效的同步机制,帮助开发者更好地管理和协调多个 goroutine 的执行。
TAGS: 使用示例 Go 语言 语言特性 sync.WaitGroup
- 联想电脑升级 Win11 操作指南及图解
- Win11 电脑蓝屏显示需重启,如何应对?
- 电脑长时间处于“正在准备配置 Windows 请勿关闭计算机”状态的解决办法
- U盘装 Win11 提示所选磁盘为 GPT 分区无法安装怎么办
- Win11 访问局域网共享文件输入网络凭据的解决办法
- Win11 家庭版转专业版的方法:如何从家庭版升级到专业版
- Win11 微软应用商店软件下载安装出错,错误代码 0x8D050002 解决办法
- Win11 笔记本 wifi 功能消失的解决之道
- Win11 输入法选字框消失?两种方法助你快速解决!
- Win11 关闭搜索亮点功能的方法
- Win11 自带 edge 无法打开的解决之道
- Win11 鼠标指针图案更换方法
- 如何在 Win11 中显示固定应用
- Win11 设备驱动程序未找到的修复方法
- Win11 键盘无法输入的原因及解决办法