gpt4 book ai didi

go - 如何在高并发系统中创建全局计数器

转载 作者:IT王子 更新时间:2023-10-29 02:25:30 26 4
gpt4 key购买 nike

我正在创建全局计数器,它可以在 goroutine 之间共享。引用这个question ,下面的代码可以满足我的需求。

但是如果有很多并发请求,是否会发生相同的数字分配给两个以上的goroutines?如果是这样,我该如何避免这种情况?

这个问题与我粘贴的链接不同,因为我想知道的是如何使用 channel 计数器避免重复。如果唯一可能的解决方案是其他实现,如 sync.Mutex 或 atomic,我会使用它。然而,根据链接(再次), channel 似乎是最好的选择。任何评论或回答都非常有帮助。提前致谢。我是多线程编码的新手而且也去了,这可能是个愚蠢的问题。对此感到抱歉。

package main

import (
"fmt"
"time"
)

var counter int
var counter_chan chan int

func main() {
counter_chan = make(chan int, 100)

counter = 0

go func() {
for {
select {
case chanc := <-counter_chan:
counter += chanc
fmt.Printf("%d \n", counter)
}
}
}()

for i := 0; i < 10; i++ {
go AddCounter(counter_chan)
}

time.Sleep(time.Second)
fmt.Printf("Total Count is ... %d \n", GetCount())

}

func AddCounter(ch chan int) {
ch <- 1
}

func GetCount() int {
return counter
}

func ResetCount() {
if counter > 8190 {
counter = 0
}
}

-- 编辑 2018 年 5 月 14 日

假设以下代码对于获取和重置值是线程安全的。我说得对吗?

package main

import (
"fmt"
"time"
)

var counter int
var addCounterChan chan int
var readCounterChan chan int

func main() {
addCounterChan = make(chan int, 100)
readCounterChan = make(chan int, 100)

counter = 0

go func() {
for {
select {
case val := <-addCounterChan:
counter += val
if counter > 5 {
counter = 0
}
readCounterChan <- counter
fmt.Printf("%d \n", counter)
}
}
}()

for i := 0; i < 10; i++ {
go AddCounter(addCounterChan)
}

time.Sleep(time.Second)

for i := 0; i < 10; i++ {
fmt.Printf("Total Count #%d is ... %d \n", (i + 1), GetCount(readCounterChan))
}

}

// Following two functions will be implemented in another package in real case.
func AddCounter(ch chan int) {
ch <- 1
}

func GetCount(ch chan int) int {
r := <-ch
return r
}

最佳答案

您问题的直接答案是:您粘贴的代码更新 计数器安全,但不安全地读取或重置它。

然而,与您链接到的问题中接受的答案相反,实现共享计数器的最简单、最有效的方法是使用 atomic。包裹。它可用于自动递增几种常见类型。示例:

var globalCounter *int32 = new(int32)

// .. later in your code
currentCount := atomic.AddInt32(globalCounter, 1)

关于go - 如何在高并发系统中创建全局计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50304851/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com