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代码示例的主要内容,如果未能解决你的问题,请参考以下文章