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<reqNum;i++{
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值