类似 java 函数中的栅栏函数,go语言中也有类似实现,一种是使用sync.WaitGroup实现,另一种是使用channel的阻塞方式实现,通过实战了解下。
第一种方法:
sync.WaitGroup类似java中的栅栏
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!!!”)
}
第二种方法:
var num=14 //定义一工并发多少数量
var cnum chan int
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
}