在 Go 语言中创建协程(Goroutine)的成本非常低,因此稍不注意就可能创建出大量的协程,一方面会造成资源的浪费,另一方面不容易控制这些协程的状态。
控制goroutine的数量是一种控制并发的通用方法,先看下代码。
package main
import (
"fmt"
"time"
)
var wp chan struct{}//定义全局变量channel,用空结构体代表资源
func service(i int){
select {
case wp<- struct{}{}://一个请求表示占用一个资源
doSomething(i)
<-wp
default:
fmt.Println("service busy, please try again later:groutine",i)
}
}
//模拟业务耗时
func doSomething(i int) {
fmt.Printf("groutine%d\n", i)
time.Sleep(500*time.Millisecond)
}
func init() {
wp = make(chan struct{},30) //初始化channel大小
}
测试函数
package main
import (
"fmt"
"runtime"
"sync"
"testing"
"time"
)
func TestChannel(t *testing.T) {
reqNum:=300
var wg sync.WaitGroup
//wg.Add(reqNum)
for i := 0;i<reqNum;i++{