go并发控制--控制goroutine数量

        在 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

你可能感兴趣的:(golang,golang,开发语言,后端)