golang_sync: sync.WaitGroup任务组的用法介绍

版权声明:版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87889804

sync包提供了基本的同步基元.本包的类型的值不应被拷贝。

go中对同步,异步的概念:
同步:一边写,一边读;异步:听课,司机开车

sync.WaitGroup
type WaitGroup struct {
    // 包含隐藏或非导出字段
}

WaitGroup用于等待一组线程的结束。父线程调用Add方法来设定应等待的线程的数量。每个被等待的线程在结束时应调用Done方法。同时,主线程里可以调用Wait方法阻塞至所有线程结束。

Add方法 创建计数器

func (wg *WaitGroup) Add(delta int)

Add方法向内部计数加上delta,delta可以是负数;如果内部计数器变为0,Wait方法阻塞等待的所有线程都会释放,如果计数器小于0,方法panic。注意Add加上正数的调用应在Wait之前,否则Wait可能只会等待很少的线程。一般来说本方法应在创建新的线程或者其他应等待的事件之前调用。

Done方法 减少WaitGroup计数器的值,应在线程的最后执行

func (wg *WaitGroup) Done()

Done方法减少WaitGroup计数器的值,应在线程的最后执行

Wait方法 阻塞直到WaitGroup计数器减为0。

func (wg *WaitGroup) Wait()

Wait方法阻塞直到WaitGroup计数器减为0。

场景: 运用多go程输出1-9

func main() {
	c:=make(chan bool)
	for i:=1;i<10 ;i++  {
		go setValue(c,i) //启动9个go程,执行程序
	}
	for i:=1;i<10 ;i++  {
		<-c
	}
}
func setValue(c chan bool,i int){
	fmt.Println(i)
	c<-true
}

结果:1-9打印的顺序是无序的,但是1-9全都可以打印出来

也可以通过任务组的方式实现上面的效果:

func main() {
	wg:=sync.WaitGroup{}		//创建任务组
	wg.Add(9)			//在组中添加9个任务
	for i:=1;i<10 ;i++  {
		go setValue(&wg,i)
	}
	wg.Wait()				//等待任务组中任务全部执行外部
}
func setValue(wg *sync.WaitGroup,i int){
	fmt.Println(i)
	wg.Done()		//完成任务,在任务组中减1
}

Output:

9
4
6
1
5
7
8
2
3

猜你喜欢

转载自blog.csdn.net/weixin_43851310/article/details/87889804