У меня странная ошибка - PullRequest
       0

У меня странная ошибка

0 голосов
/ 12 ноября 2018

даны следующие 2 функции.

func main() {
    index := int(0)

    for {
        Loop(index)
        index = (index + 1) % 86400 // Max interval: 1 day
        time.Sleep(1 * time.Second)
    }
}

func Loop(index int) {
    if index%10 == 0 {
        go doSomething...
    }
}

Я хочу что-то выполнять каждые 10/60/3600 секунд. Поэтому я подумал, что увеличение индекса с модулем должно сделать это.

Но я заметил (особенно на серверах с высоким трафиком), что некоторые из этих циклов, по-видимому, пропускаются.

Я просматривал свои журналы, и иногда каждые 10 секунд что-то происходит, но иногда разрыв составляет до 1 минуты.

Кто-нибудь знает, почему это происходит?

1 Ответ

0 голосов
/ 12 ноября 2018

Я бы рекомендовал использовать time.Ticker для выполнения некоторых действий каждые N секунд. Таким образом, вы используете встроенные таймеры и активируете процессор только тогда, когда нужно что-то сделать. Даже если процессор не используется интенсивно, time.Sleep и цикл for не самый надежный способ планирования задач. Например (по ссылке выше):

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()
    done := make(chan bool)
    go func() {
        time.Sleep(10 * time.Second)
        done <- true
    }()
    for {
        select {
        case <-done:
            fmt.Println("Done!")
            return
        case t := <-ticker.C:
            fmt.Println("Current time: ", t)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...