七叶笔记 » golang编程 » Golang 中 栅栏 方式

Golang 中 栅栏 方式

类似 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

}

相关文章