雖然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\n", runtime.NumGoroutine()) }
我的理解:限制goroutine的數量:
就是通過channel的異步阻塞的特性來完成
上面的代碼還不健壯,加上waitgroup以及鎖,可以在不同的場景下適用