码迷,mamicode.com
首页 > 其他好文 > 详细

3.2 go WaitGroup代码示例

时间:2019-10-08 12:50:47      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:代码   WaitGroup   ace   one   create   sync   使用   UNC   res   

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代码示例

标签:代码   WaitGroup   ace   one   create   sync   使用   UNC   res   

原文地址:https://www.cnblogs.com/perfei/p/11634627.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!