标签:代码 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 --------所有协程执行完毕-------------
标签:代码 WaitGroup ace one create sync 使用 UNC res
原文地址:https://www.cnblogs.com/perfei/p/11634627.html