首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试用WaitGroup理解go func

WaitGroup是Go语言中的一个并发控制工具,用于等待一组goroutine的执行完成。它通过计数器的方式来实现等待的功能。

具体来说,WaitGroup包含了一个计数器,初始值为0。当我们启动一个goroutine时,可以调用WaitGroup的Add方法来增加计数器的值。而在goroutine的结束处,可以调用WaitGroup的Done方法来减少计数器的值。当计数器的值变为0时,WaitGroup的Wait方法会阻塞,直到所有的goroutine都执行完毕。

使用WaitGroup可以有效地控制并发执行的goroutine,确保它们都执行完毕后再进行下一步操作。这在需要等待多个goroutine完成后再进行汇总或者输出结果的场景中非常有用。

在Go语言中,使用WaitGroup的一般步骤如下:

  1. 创建一个WaitGroup对象:var wg sync.WaitGroup
  2. 在启动goroutine之前,调用Add方法增加计数器的值:wg.Add(1)
  3. 在goroutine的结束处,调用Done方法减少计数器的值:wg.Done()
  4. 在需要等待所有goroutine执行完毕的地方,调用Wait方法进行阻塞:wg.Wait()

WaitGroup的使用示例代码如下:

代码语言:go
复制
package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			fmt.Printf("goroutine %d\n", i)
		}(i)
	}

	wg.Wait()
	fmt.Println("All goroutines finished.")
}

在上述示例中,我们创建了一个包含5个goroutine的循环。每个goroutine都会打印出自己的编号。通过WaitGroup的Add和Done方法,我们确保了所有的goroutine都执行完毕后再打印"All goroutines finished."。

腾讯云提供了一系列与并发控制相关的产品和服务,例如弹性容器实例、容器服务、无服务器云函数等,可以根据具体需求选择合适的产品进行开发和部署。

更多关于WaitGroup的详细信息,可以参考腾讯云的官方文档:WaitGroup - sync

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Go中的同步与锁

最近学习了Go语言中同步包中的互斥锁、读写锁、Once、waitGroup。在并发程序开发的过程中,这两种锁是非常重要的,包括对共享资源进行访问控制的时候。sync是Go语言中的标准库。...WaitGroup WaitGroup 是可以一个goroutine集合,当集合里的goroutine执行完毕后,这个WaitGroup就会自动结束。你可以定义这个WaitGroup的大小。...他里面只有三个方法: func (wg *WaitGroup) Add(delta int) {} //定义大小 func (wg *WaitGroup) Done() {} func (wg *WaitGroup...}(i) } wg.Wait() } 建议大家可以把上面的代码都跑一遍,方便自己理解代码的含义。...结合官方文档来理解会更加容易。 参考 https://gowalker.org/sync 更多的信息请大家参考文档

85850
  • golang 多协程的同步方法总结

    (当然, 也可以通过一个共享计数器变量来实现). package main import ( "fmt" "sync" ) var waitGroup = sync.WaitGroup{} func...main() { for i := 0; i < 100; i++ { go incrNum() } // 等待其他协程处理完毕(共享变量为0) waitGroup.Wait() fmt.Println...(共享变量-1) waitGroup.Done() } 消息通知 多个协程启动时, 等待某个命令到来时执行命令, 唤醒等待协程. go 对此类操作也进行了处理, 感觉好贴心哦....(r) } sync 简单总结 针对go系统的sync模块, 提供的基础功能如下: 互斥锁 Mutex 读写锁 RWMutex 函数单次执行 Once 协程执行等待 WaitGroup 协程消息通知...终极通信-channel channel是一个协程安全的通信管道, 简单理解为数据从一侧放入, 从另一侧拿出. 这玩意感觉能玩出花来, 还不太理解, 留到国庆研究.

    5.5K21

    并发编程包之 errgroup

    方法就可以启动一个协程了,Go方法中已经封装了waitGroup的控制操作,不需要我们手动添加了,最后我们调用Wait方法,其实就是调用了waitGroup方法。...(ctx context.Context) (*Group, context.Context) func (g *Group) Go(f func() error) func (g *Group) Wait...方法 func (g *Group) Go(f func() error) { g.wg.Add(1) go func() { defer g.wg.Done() if err := f...= nil { g.cancel() } }) } }() } Go方法中运行步骤如下: 执行Add()方法增加一个计数器 开启一个协程,运行我们传入的函数f,使用waitGroup...,如果前面赋值了cancel,要执行cancel()方法 返回错误信息,如果有goroutine出现了错误才会有值 小结 到这里我们就分析完了errGroup包,总共就1个结构体和3个方法,理解起来还是比较简单的

    49120

    golang 系列:waitgroup 解析

    摘要 Golang 提供了简洁的 go 关键字来让开发者更容易的进行并发编程,同时也提供了 WaitGroup 对象来辅助并发控制。...WaitGroup 的使用场景和方法 当我们有很多任务要同时进行时,如果并不需要关心各个任务的执行进度,那直接使用 go 关键字即可。...) { doSomething() wg.Done() // 2.1、完成任务 } func main() { var wg sync.WaitGroup wg.Add(5)...// 3、阻塞等待所有任务完成 } WaitGroup 源码分析 上面 WaitGroup 的使用很简单,接下来我们到 src/sync/waitgroup.go 里分析下它的源码。...此处操作系统可以理解Go 的运行时 runtime,进程可以理解为协程。 源码解释 最后,我们来深入 WaitGroup 的三个方法,进行源码分析。

    68400
    领券