我正在为并发go应用程序实现全局计数器。
我的用例是计数器应在x秒后重置并写入DB。
我尝试使用互斥锁(我可以使用此值重置计数器)
当我增加计数器时,我也会记录一些东西。 我发现在应用程序运行约8-9个小时后,记录的行数与计数器值不匹配(互斥体版本),计数器值始终较小。 我仍然没有找到原因。
我以以下方式使用互斥锁
func (s *Metrics) AddQps() {
s.qpsMu.Lock()
s.qps++
s.qpsMu.Unlock()
}
And the flushing of metrics is done as follows.
for {
ticker := time.NewTicker(time.Duration(interval) * time.Second)
select {
case <-ticker.C:
logger.Println("flushing metrics...")
}
}
我已经实现了互斥锁部分引用 [How to create global counter in golang in highly concurrent system
由于上述问题,我现在尝试使用sync.atomic计数器。 因为我希望指标在x秒后刷新,所以我想重置计数器。
答案 0 :(得分:1)
那么使用这样的东西有什么问题?
func TestNameAtomic(t *testing.T) {
var i int64
atomic.AddInt64(&i, 1)
atomic.AddInt64(&i, 1)
atomic.AddInt64(&i, 1)
fmt.Println(i)
atomic.CompareAndSwapInt64(&i, i, 0)
fmt.Println(i)
}