3.2 go WaitGroup代码示例

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

主要的方法有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 
", 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 
--------所有协程执行完毕-------------
原文地址:https://www.cnblogs.com/perfei/p/11634627.html