•纯技术
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 源码
本文同步自掘金
如果发现内容有误或需要更新,请访问掘金原文进行查看。
Share
Support / Sponsor
如果这类内容对你有帮助
这里放一个阿里云 AIGC 活动入口。只有在你本身就有相关需求时,再通过它了解即可;如果产生推广收益,我会优先用于支付服务器、域名和网站维护费用。
Related Notes
