小编Boc*_*jim的帖子

为高度并发应用程序实现全局计数器的最佳方法?

为高度并发的应用程序实现全局计数器的最佳方法是什么?在我的情况下,我可能有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)

concurrency go

40
推荐指数
5
解决办法
3万
查看次数

标签 统计

concurrency ×1

go ×1