0Pricing
Go Academy · Урок

Планирование по времени

Запускайте периодические задачи

«Планирование по времени» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Планирование по времени
  2. Библиотека robfig/cron
  3. Тикеры для интервалов
  4. Корректное завершение задач
← Назад к Go Academy