Планирование по времени
Запускайте периодические задачи
«Планирование по времени» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
Запуск работы по расписанию
Многим системам нужна периодическая работа: ночная очистка временных файлов, отправка сводного письма каждое утро, опрос API каждую минуту. В этом уроке вводится планирование работы по времени в Go с использованием стандартной библиотеки.
Пакет time
Пакет Go time служит основой для этого. Основные инструменты:
time.Sleepприостанавливает горутинуtime.Afterвозвращает канал, который срабатывает один разtime.Tickerсрабатывает многократноtime.Timerсрабатывает один раз после задержки
Наивный цикл
Самый простой планировщик: выполнить работу, подождать и повторить.
package main
import (
"fmt"
"time"
)
func main() {
for i := 0; i < 3; i++ {
fmt.Println("tick", i)
time.Sleep(10 * time.Millisecond)
}
}Почему Sleep даёт дрейф
Цикл с ожиданием дрейфует: если работа занимает 200 мс, а затем выполняется ожидание в течение 1 с, фактический интервал составляет 1,2 с, и эта разница накапливается. Для точных интервалов используйте Ticker, который рассматривается в следующем уроке.
time.After для однократных задержек
time.After(d) возвращает канал, из которого один раз можно получить значение по истечении длительности d. Это полезно в select для ограничения времени ожидания.
select {
case <-time.After(2 * time.Second):
fmt.Println("2s elapsed")
}time.Timer
Timer срабатывает один раз, и его можно остановить или сбросить, в отличие от time.After, отменить который нельзя.
t := time.NewTimer(5 * time.Second)
defer t.Stop()
<-t.C
fmt.Println("fired")Планирование на определённое время
Чтобы запустить работу, например, в 3 AM, вычислите длительность до этого момента и установите на неё ожидание или таймер, а затем запланируйте следующий запуск на следующий день.
now := time.Now()
next := time.Date(now.Year(), now.Month(), now.Day(), 3, 0, 0, 0, now.Location())
if next.Before(now) {
next = next.Add(24 * time.Hour)
}
fmt.Println("sleep for", time.Until(next))Длительности имеют тип
time.Duration — это int64 с количеством наносекунд и удобными константами: time.Second, time.Minute, time.Hour. Умножайте их для создания понятных интервалов.
every := 30 * time.Minute
fmt.Println(every)Монотонные и календарные часы
time.Now в Go содержит монотонное показание часов, используемое для измерения прошедшего времени и не зависящее от корректировок часов. Для вычисления длительностей используйте time.Since, а не вычитание показаний календарных часов.
start := time.Now()
// ... work ...
fmt.Println("took", time.Since(start))Когда стоит выбрать библиотеку
Для сложных расписаний, например «каждый будний день в 9:15», ручное вычисление времени чревато ошибками. Библиотека robfig/cron, которая рассматривается далее, сама разбирает выражения cron.
Исполняемый пример: вычисление следующего запуска
Эта автономная программа с помощью только пакета time вычисляет время до следующей границы минуты.
package main
import (
"fmt"
"time"
)
func main() {
now := time.Date(2026, 1, 1, 10, 30, 45, 0, time.UTC)
nextMinute := now.Truncate(time.Minute).Add(time.Minute)
fmt.Println("now:", now.Format("15:04:05"))
fmt.Println("next run:", nextMinute.Format("15:04:05"))
fmt.Println("wait:", nextMinute.Sub(now))
}Проверка
Проверьте своё понимание планирования работы по времени.
Повторение
Вы изучили основы планирования работы по времени:
- Пакет
timeпредоставляет Sleep, After, Timer и Ticker - Циклы с Sleep дрейфуют, а тикеры сохраняют расписание
- Вычисляйте длительность до заданного момента с помощью
time.Until - Используйте
time.Sinceи монотонные часы для измерения прошедшего времени
Часто задаваемые вопросы
Урок «Планирование по времени» бесплатный?
Да — полный текст урока «Планирование по времени» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Планирование по времени»?
Запускайте периодические задачи Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Планирование по времени»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Планирование по времени
- Библиотека robfig/cron
- Тикеры для интервалов
- Корректное завершение задач