首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >sync.WaitGroup 简介

sync.WaitGroup 简介

原创
作者头像
孟斯特
发布2023-11-23 17:06:35
发布2023-11-23 17:06:35
4650
举报
文章被收录于专栏:code人生code人生

sync.WaitGroup 是 Go 语言标准库 sync 包提供的一个同步工具,用于等待一组协程完成执行。它通常用于确保所有协程完成后再继续执行后续的代码。WaitGroup 提供了三个主要方法:AddDone、和 Wait

1. WaitGroup 方法

  • Add 增加等待的协程数量。在 Add 被调用时,等待的协程数量会增加。每个协程在开始执行时应该调用 Add,表示有一个协程需要等待。
代码语言:go
复制
func (wg *WaitGroup) Add(delta int)
  • Done 减少等待的协程数量。在每个协程完成执行时,应该调用 Done 减少等待的协程数量。等待的协程数量减为零时,Wait 方法将返回。
代码语言:go
复制
func (wg *WaitGroup) Done()
  • Wait 阻塞直到等待的协程数量减为零。Wait 会一直阻塞当前协程,直到等待的协程数量减为零。一般会在主协程中调用 Wait
代码语言:go
复制
func (wg *WaitGroup) Wait()

2. 使用示例

以下是一个简单的示例,演示了如何使用 WaitGroup 等待一组协程完成:

代码语言:go
复制
package main

import (
	"fmt"
	"sync"
	"time"
)

var wg sync.WaitGroup

func main() {
	
	for i := 1; i <= 3; i++ {
		wg.Add(1)
		go worker(i)
	}

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

	fmt.Println("All workers have finished.")
}

func worker(id int) {
	defer wg.Done()
	fmt.Printf("Worker %d is starting\n", id)
	time.Sleep(2 * time.Second)
	fmt.Printf("Worker %d has finished\n", id)
}

在这个例子中,主协程使用 WaitGroup 来等待三个 worker 协程完成。每个 worker 协程在开始执行时调用 Add(1),在结束时调用 Done(),表示一个协程已完成。主协程通过 Wait 阻塞等待,直到所有的 worker 协程都完成后才继续执行。

WaitGroup 是 Go 中一种简单而强大的同步机制,适用于需要等待一组协程完成的场景,如并发任务的协同工作。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!


声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。


原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. WaitGroup 方法
  • 2. 使用示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档