加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang中如何阻塞等待所有goroutines都完成

发布时间:2020-12-16 09:27:03 所属栏目:大数据 来源:网络整理
导读:有一天,一个人问了我此问题,回头仔细翻阅了一下资料,仔细的想了一下,这个问题的解决有两种方案。方案一:也是推荐方案,也是官方推荐方案,涉及到一个写并发经常关注的模块sync模块,利用里面的sync.WaitGroup去做代码如下:package mainimport(????????

有一天,一个人问了我此问题,回头仔细翻阅了一下资料,仔细的想了一下,这个问题的解决有两种方案。方案一:也是推荐方案,也是官方推荐方案,涉及到一个写并发经常关注的模块sync模块,利用里面的sync.WaitGroup去做代码如下:package mainimport(????????"fmt" ????????"sync" ????????"time"????????"runtime")var wg sync.WaitGroup //定义一个同步等待的组func main() {????maxProcs := runtime.NumCPU() //获取cpu个数????runtime.GOMAXPROCS(maxProcs) //限制同时运行的goroutines数量????for i:=0;i<10;i++{????????????wg.Add(1)//为同步等待组增加一个成员????????????go Printer(i)//并发一个goroutine????}????wg.Wait() //阻塞等待所有组内成员都执行完毕退栈????fmt.Println("WE DONE!!!")}//定义一个Printer函数用于并发func Printer(a int)(){ ????????time.Sleep(2000 * time.Millisecond)????????fmt.Printf("i am %dn",a)????????defer wg.Done()}方案二:思路也不绕路,利用的channel的阻塞机制,直接上代码了。package mainimport(????????"fmt"????????"time"????????"runtime")var num=14 //定义一工并发多少数量var cnum chan intfunc main(){???maxProcs := runtime.NumCPU()// 获取cpu个数????runtime.GOMAXPROCS(maxProcs)//限制同时运行的goroutines数量????cnum=make(chan int,num) //make一个chan,缓存为num????for i:=0;i<num;i++{????????????go Printer(i)????}// 下面这个for循环的意义就是利用信道的阻塞,一直从信道里取数据,直到取得跟并发数一样的个数的数据,则视为所有goroutines完成。????for i:=0;i<num;i++{ ????????????<-cnum????}????fmt.Println("WE DONE!!!")}func Printer(a int)(){????????time.Sleep(2000 * time.Millisecond)????????fmt.Printf("i am %dn",a)????????cnum <- 1 //goroutine结束时传送一个标示给信道。}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读