Тикеры для интервалов
Повторяйте действия через заданные интервалы
«Тикеры для интервалов» — бесплатный урок Go Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Повторение с фиксированной частотой
Если Вам нужно просто выполнять действие каждые N секунд, подходящим инструментом будет Ticker. В отличие от цикла с задержкой, он срабатывает с постоянным интервалом и не сбивается из-за времени выполнения работы.
Создание Ticker
time.NewTicker(d) возвращает Ticker, в канал C которого каждые d поступает текущее время.
ticker := time.NewTicker(time.Second)
defer ticker.Stop()Всегда останавливайте Ticker
Ticker поддерживает активность внутреннего таймера. Если никогда не вызвать Stop(), возникнет утечка ресурсов. Сразу после создания используйте defer ticker.Stop().
Перебор канала
Можно перебирать канал тикера с помощью цикла, чтобы реагировать на каждый сигнал.
for t := range ticker.C {
fmt.Println("tick at", t)
}Остановка с помощью оператора выбора
Объедините тикер с каналом завершения, чтобы цикл мог корректно выйти.
for {
select {
case <-ticker.C:
doWork()
case <-done:
return
}
}Ticker и таймер
Главное различие:
- Таймер срабатывает один раз после задержки
- Ticker срабатывает повторно через заданный интервал
Используйте таймер для одноразовых ограничений времени, а Ticker — для периодической работы.
Удобство time.Tick
time.Tick(d) возвращает только канал. Это удобно, но остановить его нельзя, поэтому в программах с долгим временем работы он приводит к утечке ресурсов. В полноценных программах вместо него предпочитайте NewTicker.
for range time.Tick(time.Second) {
// simple, but cannot Stop -> avoid in servers
}Обработка медленной работы
Если работа занимает больше времени, чем заданный интервал, сигналы не ставятся в очередь: тикер отбрасывает их, а не создаёт всплеск запусков. Поэтому очередь невыполненных сигналов не накапливается, но при высокой нагрузке некоторые срабатывания могут пропускаться.
Изменение частоты
Чтобы изменить интервал, создайте новый тикер. Начиная с Go 1.15, также можно использовать ticker.Reset(d), чтобы изменить период без выделения нового объекта.
ticker.Reset(500 * time.Millisecond)Отмена контекста
В реальных сервисах управляйте циклами тикеров с помощью context.Context, чтобы сигналы завершения корректно их останавливали.
case <-ctx.Done():
return ctx.Err()Готовый к запуску пример: Ticker с фиксированной частотой
Эта автономная программа трижды срабатывает через фиксированный интервал, а затем корректно останавливается с помощью счётчика.
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(10 * time.Millisecond)
defer ticker.Stop()
count := 0
for range ticker.C {
count++
fmt.Println("tick", count)
if count == 3 {
break
}
}
fmt.Println("done")
}Проверка знаний
Проверьте, насколько хорошо Вы поняли работу тикеров.
Итоги
Вы изучили тикеры для работы с интервалами:
time.NewTicker(d)срабатывает каждыеdи отправляет сигналы в свой каналC- Всегда используйте
defer ticker.Stop(), чтобы избежать утечек ресурсов - При медленной работе тикеры отбрасывают сигналы, а не создают всплеск запусков
- Используйте
Resetдля изменения частоты, а контекст или канал завершения — для выхода
Часто задаваемые вопросы
Урок «Тикеры для интервалов» бесплатный?
Да — полный текст урока «Тикеры для интервалов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Тикеры для интервалов»?
Повторяйте действия через заданные интервалы Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Тикеры для интервалов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Планирование по времени
- Библиотека robfig/cron
- Тикеры для интервалов
- Корректное завершение задач