go语言中控制并发数量的方法
因为go语言层面支持并发,所以面试中经常会问到并发的问题,比如说控制go并发数量的方式有哪些?
下面是我个人整理的两个例子:
<blockquote>func waitGroup() {
count := 10
wg := sync.WaitGroup{}
for i := 0; i < count; i {
wg.Add(1)
go func(j int) {
fmt.Print(j)
wg.Done() // 也可使用 wg.Add(-1)
}(i)
}
wg.Wait()
}
</blockquote>上面主要用到的是go中sync包下的waitGroup,这也是在工作中比较常见的实现方式,关键点就是把握好Add方法的位置,Wait方法则是等待所有的协程执行完毕
<blockquote>func channel() {
count := 10 // 最大支持并发
sum := 100 // 任务总数
c := make(chan struct{}, count) // 控制任务并发的chan
sc := make(chan struct{}, sum) // 控制任务总数的chan
defer close(c)
defer close(sc)
for i:=0; i
c <- struct{}{} // 作用类似于waitgroup.Add(1)
go func(j int) {
fmt.Println(j)
<- c // 执行完毕,释放资源
sc <- struct {}{} // 记录到执行总数里
}(i)
}
for i:=sum; i>0;i-- {
<- sc
}
}
</blockquote>上面的例子用到的是go中的channel,利用channel阻塞的特性和带缓冲的channel来实现控制并发数量,其中sc这个channel是可以去掉的,例子里用只是为了防止主程序退出之后,没有全部输出,正常工作中,程序一般都是阻塞式的,所以可以去掉。
本文来自php中文网的golang教程栏目:https://www.php.cn/be/go/
到此这篇关于“go语言中控制并发数量的方法”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!您可能感兴趣的文章:
Go语言发展历史、核心、特性及学习路线
[Go学习] 并发控制之WaitGroup计数信号量
想系统学习GO语言(Golang
Go语言学习3----Go语言特色
从零开始学习GO语言-搭建Go语言开发环境-快速开发入门第一个小程序
go语言和python哪个难
Go 语言十年而立,Go2 蓄势待发
[GO语言基础] 一.为什么我要学习Golang以及GO语言入门普及
Go Base
【Golang】01 Go 语言初识