虽然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,100) c=3 ) //初始化工作池 func init(){ for i:=0;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 * 100) } func test(){ fmt.Printf("%d====numGo ", runtime.NumGoroutine()) }
我的理解:限制goroutine的数量:
就是通过channel的异步阻塞的特性来完成
上面的代码还不健壮,加上waitgroup以及锁,可以在不同的场景下适用