go WaitGroup 的使用方法

 基础语法  2023-03-23  admin  374  504

在 Go 中,sync 包下的 WaitGroup 能有助于我们控制协程之间的同步。当需要等待一组协程都执行完各自任务后,才能继续后续逻辑。这种场景,就非常适合使用它。

WaitGroup 提供三个 API。

Add(delta int) 函数提供了 WaitGroup 的任务计数,delta 的值可以为正也可以为负,通常在添加任务时使用。

Done() 函数其实就是 Add(-1),在任务完成时调用。

Wait() 函数用于阻塞等待 WaitGroup 的任务们均完成,即阻塞等待至任务数为 0。

方式一:

package main

import (
   "fmt"
   "sync"
)

func worker(msg string, wg *sync.WaitGroup) {
   wg.Add(1)
   defer wg.Done()
   fmt.Printf("worker do %s\n", msg)
}

func main() {
   var wg sync.WaitGroup
   go worker("task 1", &wg)
   go worker("task 2", &wg)
   go worker("task 3", &wg)
   go worker("task 4", &wg)
   go worker("task 5", &wg)
   fmt.Println("waiting")
   wg.Wait()
   fmt.Println("main exit")
}

方式二:

package main

import (
	"fmt"
	"sync"
)

func worker(msg string) {
	fmt.Printf("worker do %s\n", msg)
}

func main() {
	var wg sync.WaitGroup

	for i := 0; i < 5; i++ {
		wg.Add(1)
		go func(i int) {
			defer wg.Done()
			worker(fmt.Sprintf("task %d", i+1))
		}(i)
	}
	fmt.Println("waiting")
	wg.Wait()
	fmt.Println("main exit")
}


如果文章对您有帮助,点击下方的广告,支持一下作者吧!

转载必须注明出处:

go WaitGroup 的使用方法 —— code.cent123.com

相关推荐


在go协程中共享资源需要加锁处理

在go协程中共享资源需要加锁处理packagemain import( &quot;fmt&quot; &quot;sync&quot; ) //创建一个互斥锁 varmutex=&amp;sync.Mutex{} //定义一个共享资源 varsharedResource=0 //定义一个等待组 varwg=sync.WaitGroup{} //定义一

Go 中 实现基于 channel 的简单 生产者 消费者模型

Go 中 实现基于 channel 的简单 生产者 消费者模型packagemain import( &quot;fmt&quot; &quot;strconv&quot; &quot;sync&quot; ) //生产者 funcproducer(chchan&lt;-string,wg*sync.WaitGroup){ deferwg.Done() fo

go 协程管理及传参处理

Go语言中的goroutine虽然相对于系统线程来说比较轻量级(初始栈大小仅2KB),(并且支持动态扩容),而正常采用java,c++等语言启用的线程一般都是内核态的占用的内存资源一般在4m左右,而假设我们的服务器CPU内存为4G,那么很明显才用的内核态线程的并发总数量也就是1024个,相反查看一下Go语言的协程则可以达到4*1024*1024/2=200w.这么一看就明白了为什么Go语言天生支持

go sync 包 WaitGroup 的使用

sync包提供了基本的同步基元,如互斥锁。除了Once和WaitGroup类型,大部分都是适用于低水平程序线程,高水平的同步使用channel通信更好一些。packagemain import( &quot;fmt&quot; &quot;sync&quot; ) funcmain(){ varwgsync.WaitGroup items:=[]int{1,2,3,4