3.2 go WaitGroup代码示例

Posted perfei

tags:

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

sync.WaitGroup提供了一种安全的多协程处理方法,内部使用race来处理,避免了资源竞争及锁的产生。

主要的方法有Add、Done、Wait,可以等待一组协程全部执行完毕后,主程序才继续往下执行。

代码示例:

package main

import(
	"fmt"
	"math/rand"
	"sync"
	"time"
)

type Worker struct 
	In chan int
	Done func()


func (wk *Worker) Do1(seq int)
	for n := range wk.In 
		time.Sleep(time.Duration(rand.Intn(1000))*time.Millisecond)
		fmt.Printf("number %d res : %d \n", seq, n)
		wk.Done()
	



func createWorker(seq int, wg *sync.WaitGroup) Worker
	wk := Worker
		In: make(chan int),
		Done: func()
			wg.Done()
		,
	
	go wk.Do1(seq)
	return wk


func test1()
	var wg sync.WaitGroup
	var wks [8]Worker
	wg.Add(16)
	fmt.Println("-----------协程开始执行---------------- ")
	for i:=0;i<8;i++
		wks[i] = createWorker(i,&wg)
	
	
	for i:=0;i<8;i++
		wks[i].In <- i
	
	
	for i:=0;i<8;i++
		wks[i].In <- 100 + i
	
	
	wg.Wait()
	fmt.Println("--------所有协程执行完毕------------- ")




func main()
	test1()

 

输出结果

-----------协程开始执行---------------- 
number 2 res : 2 
number 0 res : 0 
number 3 res : 3 
number 4 res : 4 
number 5 res : 5 
number 0 res : 100 
number 6 res : 6 
number 1 res : 1 
number 7 res : 7 
number 4 res : 104 
number 3 res : 103 
number 1 res : 101 
number 7 res : 107 
number 2 res : 102 
number 6 res : 106 
number 5 res : 105 
--------所有协程执行完毕-------------

 

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

7.3 Go语言中通过WaitGroup控制并发

7.3 Go语言中通过WaitGroup控制并发

Go语言sync包中的WaitGroup使用实例

golang同步示例代码

golang同步示例代码

golang WaitGroup使用示例