golang中如何阻塞等待所有goroutines都完成
有一天,一个人问了我此问题,回头仔细翻阅了一下资料,仔细的想了一下,这个问题的解决有两种方案。
方案一:
也是推荐方案,也是官方推荐方案,涉及到一个写并发经常关注的模块sync模块,利用里面的sync.WaitGroup去做
代码如下:
package main
import(
"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 %d\n",a)
defer wg.Done()
}
方案二:
思路也不绕路,利用的channel的阻塞机制,直接上代码了。
package main
import(
"fmt"
"time"
"runtime"
)
var num=14 //定义一工并发多少数量
var cnum chan int
func 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 %d\n",a)
cnum <- 1 //goroutine结束时传送一个标示给信道。
}
最新文章
- listView当中有嵌套了有onClickListener的控件时ListView自身的onItemClick无响应的解决方案
- springmvc之图片上传
- SQL: enable sa Account in SQL Server
- 【洛谷 p3386】模板-二分图匹配(图论)
- Jenkins入门系列之——00答疑解惑
- HTML+CSS学习笔记 (14) - 单位和值
- Android更改桌面应用程序launcher的两种方式
- Poj 1013 Counterfeit Dollar / OpenJudge 1013(2692) 假币问题
- UVA 10325 lottery 容斥原理
- Ansible@一个高效的配置管理工具--Ansible configure management--翻译(八)
- CTP API开发期货自动交易平台概论
- Template - Strategy
- shell脚本三——正则表达式
- 「Android」系统架构概述
- 纯手写AJAX
- Android开之在非UI线程中更新UI
- Rest架构以及什么是Restful
- Codeforces807 C. Success Rate 2017-05-08 23:27 91人阅读 评论(0) 收藏
- webpack开发工具
- 【BZOJ】【4066】简单题(强制在线)
热门文章
- Codeforces 1213D Equalizing by Division
- jQuery_val()操作
- sqli-labs(45)
- 项目配置 xml文件时 报错提示(The reference to entity ";useSSL"; must end with the &#39;;&#39; delimiter.)
- 【转】Diamond -- 分布式配置中心
- ubuntu16.04修改host上外網
- MongoDB中的_id和ObjectId
- R实现pm2.5地图数据展示
- koa 基础(一)新建/启动 项目
- leetcode-easy-others-191. Number of 1 Bits-NO