在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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 \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 --------所有协程执行完毕-------------
|
请发表评论