Таймеры и тикеры позволяют выполнять код в будущем, один или несколько раз.
Таймаут (Таймер)
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()
// Выполняем какую-либо работу
}
Читайте также:
- Каналы в Golang предлагают синхронизированное общение
- Эффективный Go: параллелизм, go-процедуры (goroutines)
- Эффективный Go: каналы
Комментариев нет:
Отправить комментарий