虽然golang的goroutine可以开启无数个goroutine,但是没有限制也是不行的。我就写一下我对goroutine数量限制的写法
1、初始化goroutine协程池。把goroutine数量开启完毕
2、在池子中调用goroutine
package main
import (
"fmt"
"runtime"
"time"
)
/*
主要逻辑
1、初始化一个工作池,并且定义要启动多少个goroutine的数量的channel
2、在这个池子里面,把数据加入到channel 这里用for循环
3、在具体的函数中的defer中把channel里面的数据去除掉
*/
var (
ch=make(chan bool,)
c=
)
//初始化工作池
func init(){
for i:=;i<c;i++{
go Queu()
}
}
func main(){
fmt.Print("main")
//获取一行的输入
var input string
fmt.Scanln(&input)
}
//在工作池中限制goroutine的数量
func Queu(){
t:=time.NewTicker(time.Second)
defer func(){
t.Stop()
}()
for{
select{
case ch<-true:
go test1()
case <-t.C:
test()
}
}
}
func test1(){
defer func(){
<-ch
}()
time.Sleep(time.Millisecond * )
}
func test(){
fmt.Printf("%d====numGo\n", runtime.NumGoroutine())
}
我的理解:限制goroutine的数量:
就是通过channel的异步阻塞的特性来完成
上面的代码还不健壮,加上waitgroup以及锁,可以在不同的场景下适用
手机扫一扫
移动阅读更方便
你可能感兴趣的文章