假设我有一个任务提供程序-可读的通道,它可能会或可能不会提供任务(取决于工作量)具体来说,这样一来可能几个小时都没有工作,然后可能突然出现任务
我想让我的goroutine池从1增长到N,其中N是出现工作时的最大并发性,然后自动崩溃到1,在那里goroutine的工作时间超过X秒,以避免内存/ cpu浪费。
我本可以只使用一个固定的池,因为goroutine非常便宜,但是我不喜欢有成千上万个空闲的goroutine,我可能会更好地使用那些资源(应该主要是ram,但仍然可以)
折叠部分相当容易
for {
timeoutTimer := time.NewTimer(WORKER_ROUTINE_TIMEOUT)
select {
case taskContext, isBatchRunning := <-runner.tasksCh:
if !isBatchRunning {
log.Print("task provider is closed, quit worker goroutine")
return
}
runner.job.Process(&taskContext)
case <-timeoutTimer.C:
return
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不确定如何使池动态增长,即在哪种条件下产生新的池
此池的优先级是能够对增加的负载做出快速反应并扩展到N(最大并发)goroutines,并能够在工作负载减少时最终崩溃到更合理的数量(最小为1)。
PS:我看到了一个https://github.com/Jeffail/tunny包,但看起来它与当前池大小的自适应缩放没有任何相似之处。我想念什么吗?
谢谢!
| 归档时间: |
|
| 查看次数: |
1047 次 |
| 最近记录: |