пятница, 27 марта 2020 г.

Таймер и Тикер в Golang

Таймеры и тикеры позволяют выполнять код в будущем, один или несколько раз.

Таймаут (Таймер)

time.After ожидает указанную продолжительность и затем отправляет текущее время по возвращаемому каналу:

select {
case news := <-AFP:
    fmt.Println(news)
case <-time.After(time.Hour):
    fmt.Println("No news in an hour.")
}

Подлежащий time.Timer не будет восстановлен сборщиком мусора, пока не сработает таймер. Если это проблема, используйте взамен time.NewTimer и вызовите его метод Stop, когда таймер больше не нужен:

for alive := true; alive; {
    timer := time.NewTimer(time.Hour)
    select {
    case news := <-AFP:
        timer.Stop()
        fmt.Println(news)
    case <-timer.C:
        alive = false
        fmt.Println("No news in an hour. Service aborting.")
    }
}

Повтор (Тикер)

time.Tick возвращает канал, который доставляет такты (ticks) с одинаковыми интервалами:

go func() {
    for now := range time.Tick(time.Minute) {
        fmt.Println(now, statusUpdate())
    }
}()

Подлежащий time.Ticker не будет восстановлен сборщиком мусора. Если это проблема, используйте взамен time.NewTicker и вызовите его метод Stop, когда тикер больше не нужен.

Ожидать, действовать и отменять

time.AfterFunc ждет в течение указанной продолжительности и затем вызывает функцию в своей собственной goroutine. Возвращает time.Timer, который можно использовать для отмены вызова:

func Foo() {
    timer = time.AfterFunc(time.Minute, func() {
        log.Println("Foo выполняется более минуты.")
    })
    defer timer.Stop()

    // Выполняем какую-либо работу
}


Читайте также:


Купить gopher

Комментариев нет:

Отправить комментарий