Вопрос проверяет знание горутин и таймеров в Go для реализации периодических задач.
В Go для выполнения задачи с заданным интервалом чаще всего применяют time.Ticker. Это структура, которая содержит канал, куда через равные промежутки времени отправляется текущее время. Запуская горутину с циклом, читающим из этого канала, можно выполнять любую работу периодически.
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(2 * time.Second)
defer ticker.Stop()
done := make(chan bool)
go func() {
for {
select {
case <-ticker.C:
fmt.Println("Выполнение задачи в", time.Now())
case <-done:
return
}
}
}()
time.Sleep(10 * time.Second)
done <- true
fmt.Println("Остановка")
}В этом примере создаётся тикер с интервалом 2 секунды. Горутина в цикле ожидает сигнал от тикера или канал завершения. Когда приходит сигнал от тикера, выполняется задача. Через 10 секунд отправляется сигнал в канал done, и горутина завершается.
Можно использовать бесконечный цикл с time.Sleep, но это менее точно, так как время выполнения самой задачи не учитывается. Ticker же гарантирует интервал между отправками сигналов, независимо от времени обработки.
Периодические задачи используются для опроса внешних сервисов, сбора метрик, очистки кэша, отправки heartbeat-сигналов и т.д. Ticker удобен, когда нужно выполнять работу строго по расписанию, не накапливая задержки.
Используйте time.Ticker для точного периодического выполнения задач в Go. Он прост в использовании, эффективен и позволяет легко управлять остановкой через каналы.