纯技术

go-zero:workergroup

goroutine 太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。在面临这样的场景时, 限制 goroutine 的数量、重用 goroutine 显然很有价值 主要是用chan来控制goruntine的数量 lang.…

3 分钟阅读
精选技术记录
持续迭代更新
Share

worker group 诞生的背景

goroutine 太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。在面临这样的场景时, 限制 goroutine 的数量、重用 goroutine 显然很有价值

实现

主要是用chan来控制goruntine的数量

// A TaskRunner is used to control the concurrency of goroutines.
type TaskRunner struct {
   limitChan chan lang.PlaceholderType
}

lang.PlaceholderType 是 struct{}的别名

构造方法

// NewTaskRunner returns a TaskRunner.
func NewTaskRunner(concurrency int) *TaskRunner {
   return &TaskRunner{
      limitChan: make(chan lang.PlaceholderType, concurrency),
   }
}

执行

// Schedule schedules a task to run under concurrency control.
func (rp *TaskRunner) Schedule(task func()) {
   rp.limitChan <- lang.Placeholder

   go func() {
      defer rescue.Recover(func() {
         <-rp.limitChan
      })

      task()
   }()
}

执行过程中可能发生的panic需要recover住

用法

func TestRoutinePool(t *testing.T) {
   times := 100
   pool := NewTaskRunner(runtime.NumCPU())

   var counter int32
   var waitGroup sync.WaitGroup
   for i := 0; i < times; i++ {
      waitGroup.Add(1)
      pool.Schedule(func() {
         atomic.AddInt32(&counter, 1)
         waitGroup.Done()
      })
   }

   waitGroup.Wait()

   assert.Equal(t, times, int(counter))
}

一般和sync.WaitGroup组合使用

go-zero 源码

github.com/zeromicro/g…


本文同步自掘金

如果发现内容有误或需要更新,请访问掘金原文进行查看。

Share

如果这类内容对你有帮助

这里放一个阿里云 AIGC 活动入口。只有在你本身就有相关需求时,再通过它了解即可;如果产生推广收益,我会优先用于支付服务器、域名和网站维护费用。

看看阿里云 AIGC 活动

相关文章

2025年8月21日

为什么有的人学了很多年的编程,还是只会【增删改查】?

为什么你写了多年代码,技术栈还停留在"增删改查"? 我们不妨从一个常见的开发者画像开始:工作数年,日常任务是理解需求、实现业务逻辑、提供数据接口。在熟悉的框架下,每天熟练地进行着数据库的增、删、改、查(CURD)操作,周而复始。 这套流程看…

2023年12月21日

Golang-常用限流算法实现

常用的限流算法有一下4中实现方式: 令牌桶 漏桶 计数器 滑动窗口 令牌桶以恒定的速度向桶里加入令牌,桶满了则不再加入令牌。当服务收到请求时尝试从桶中取出一个令牌,如果可以获取到令牌,则继续执行后续的业务,否则返回超限错误码或对应的错误页面…

2023年12月21日

go-zero 使用 Consul 作为注册中心

go-zero 默认使用etcd作为注册中心,如果我们的业务使用的consul, 可以使用zero-contrib中的consul包进行替代 文件位置:ect/**.yaml 增加consul配置 服务启动后即可在conusl/ui上查看到…