golang WaitGroup使用示例

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang WaitGroup使用示例相关的知识,希望对你有一定的参考价值。


import (
	"sync"
)

var wg *sync.WaitGroup

func action(arg int)  {
	println("the arg is:", arg)
	println("Hello")
	wg.Done()
}

func main()  {

	wg = new(sync.WaitGroup)
	for i := range []int{0, 1, 2, 3} {
		wg.Add(1)
		go action(i)
	}
	wg.Wait()
}

golang中sync.WaitGroup的使用

WaitGroup是常用的同步阻塞等待对象。WaitGroup可以调度goroutinue。首先调用同步等待组的Add(num)其中num为正整数,num会添加到WaitGroup中的counter数据里, 然后再协程内部调用Done() ,Done() 方法调用的是Add(-1),counter值会减少,所有执行wg.Wait()的goroutinue在counter不等于0时都会被堵塞。等于0时那些goroutinue不再阻塞
代码如下。下面的代码中有两个执行wg.Wait()的goroutinue。

func main() {
    var wg = sync.WaitGroup{}
    wg.Add(1)
    go func() {
        wg.Done()
    }()
    go func() {
        wg.Wait()
        fmt.Println("Hi1")
    }()
    wg.Wait()
    fmt.Println("Hi2")
}

但是因为goroutinue调度原因上面的代码的输出不唯一顺序和数量都可能不一样。具体原因可以查看golang中GMP的调度。

以上是关于golang WaitGroup使用示例的主要内容,如果未能解决你的问题,请参考以下文章

golang中sync.WaitGroup的使用

Golang WaitGroup源码分析

Golang 之 WaitGroup 源码解析

Golang使用WaitGroup的一点随想

Golang使用WaitGroup的一点随想

Golang sync.WaitGroup