为高度并发的应用程序实现全局计数器的最佳方法是什么?在我的情况下,我可能有10K-20K的例程执行"工作",我想计算例程正在集体工作的项目的数量和类型...
"经典"同步编码风格如下所示:
var work_counter int
func GoWorkerRoutine() {
for {
// do work
atomic.AddInt32(&work_counter,1)
}
}
Run Code Online (Sandbox Code Playgroud)
现在这变得更加复杂,因为我想跟踪正在完成的工作的"类型",所以我真的需要这样的东西:
var work_counter map[string]int
var work_mux sync.Mutex
func GoWorkerRoutine() {
for {
// do work
work_mux.Lock()
work_counter["type1"]++
work_mux.Unlock()
}
}
Run Code Online (Sandbox Code Playgroud)
似乎应该使用渠道或类似的东西"go"优化方式:
var work_counter int
var work_chan chan int // make() called somewhere else (buffered)
// started somewher else
func GoCounterRoutine() {
for {
select {
case c := <- work_chan:
work_counter += c
break
}
}
}
func GoWorkerRoutine() {
for {
// do …Run Code Online (Sandbox Code Playgroud)