Есть ли способ сбросить счетчик, увеличенный с помощью atomic.AddUint64? - PullRequest
0 голосов
/ 29 мая 2019

Я использую глобальные счетчики для параллельного приложения go.

Мой вариант использования заключается в том, что счетчик должен быть сброшен через x секунд и записан в БД.

Я пытался использовать мьютекс (я могу сбросить счетчик, используя это)

Также, когда я увеличиваю счетчик, я тоже что-то записываю. Я обнаружил, что после того, как приложение работает в течение приблизительно 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...")
    }
}

Я реализовал ссылку на мьютекс [ Как создать глобальный счетчик в golang в высококонкурентной системе

Из-за вышеупомянутой проблемы я сейчас пытаюсь использовать счетчики sync.atomic. Поскольку я хочу, чтобы метрика была очищена через x секунд, я хотел сбросить счетчик.

1 Ответ

1 голос
/ 30 мая 2019

Так в чем же проблема, чтобы использовать что-то вроде этого?

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)
}
...