• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

3.2goWaitGroup代码示例

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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 
--------所有协程执行完毕-------------

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap