1. Введение

Библиотека cron для Golang - мощный и простой в использовании инструмент, который позволяет планировать запуск задач в определенные моменты времени или с интервалами. Она создана по образу и подобию службы cron в UNIX, но реализована в виде самостоятельной библиотеки, которую можно интегрировать в приложения Go. Библиотека cron берет на себя планирование по времени, оставляя вам возможность сосредоточиться на задачах, которые нужно выполнить.

2. Пример

Установка библиотеки cron

Для начала использования библиотеки cron в вашем проекте сначала необходимо установить её с помощью команды go get:

go get github.com/robfig/cron/[email protected]

Импортирование пакета cron

После установки вы можете импортировать его в свою программу Go следующим образом:

import "github.com/robfig/cron/v3"

Вот простой пример настройки задания Cron, которое выводит сообщение каждую минуту:

package main

import (
    "fmt"
    "github.com/robfig/cron/v3"
)

func main() {
	c := cron.New()
	c.AddFunc("0 30 * * * *", func() { fmt.Println("Каждый час в половину") })
	c.AddFunc("@hourly",      func() { fmt.Println("Каждый час") })
	c.AddFunc("@every 1h30m", func() { fmt.Println("Каждый час тридцать") })
	c.Start()
	..
	// Функции вызываются асинхронно в своей собственной горутине.
	...
	// Функции также могут быть добавлены к работающему Cron
	c.AddFunc("@daily", func() { fmt.Println("Каждый день") })
	..
	..
	c.Stop()  // Остановить планировщик (не останавливает уже запущенные задания).
}

3. Формат выражений CRON

Выражение cron представляет собой набор времен, используя 6 полей, разделенных пробелами.

Название поля Обязательное? Допустимые значения Допустимые специальные символы
Секунды Да 0-59 * / , -
Минуты Да 0-59 * / , -
Часы Да 0-23 * / , -
День месяца Да 1-31 * / , - ?
Месяц Да 1-12 или JAN-DEC * / , -
День недели Да 0-6 или SUN-SAT * / , - ?

4. Специальные символы в выражениях CRON

  • Звездочка ( * ) Звездочка представляет все возможные значения для данного поля. Например, звездочка в поле минут означает каждую минуту.
  • Косая черта ( / ) Символ косой черты используется для указания приращений. Например, "*/15" в поле секунд означает каждые 15 секунд, начиная с нуля.
  • Запятая ( , ) Запятая используется для перечисления нескольких дискретных значений. Например, "MON,WED,FRI" в поле дня недели означает, что задание будет запущено в понедельник, среду и пятницу.
  • Дефис ( - ) Дефис обозначает диапазон значений. "9-17" в поле часов означает каждый час с 9 утра до 5 вечера.
  • Вопросительный знак ( ? ) Вопросительный знак может использоваться в полях дня месяца и дня недели для обозначения 'нет конкретного значения', что полезно, когда вам нужно указать значение для одного поля, но не для другого.

5. Предопределенные расписания

Подробное объяснение предопределенных расписаний, отображаемых в виде таблицы:

Ввод Описание Эквивалентно
@yearly (или @annually) Запустить один раз в год, полночь, 1 января 0 0 0 1 1 *
@monthly Запустить один раз в месяц, полночь, первое число месяца 0 0 0 1 * *
@weekly Запустить один раз в неделю, полночь между субботой/воскресеньем 0 0 0 * * 0
@daily (или @midnight) Запустить раз в день, полночь 0 0 0 * * *
@hourly Запустить раз в час, в начале часа 0 0 * * * *

6. Интервалы и Планирование на Фиксированные Интервалы

Планирование выполнения задач с фиксированными интервалами - еще одна мощная функция библиотеки cron. Например, чтобы запланировать выполнение задачи каждые 2 часа:

c.AddFunc("@every 2h", func() { fmt.Println("Задача запускается каждые два часа") })

7. Часовые Пояса и Планирование Задач

Интерпретация и планирование выполняются в локальном часовом поясе машины, где исполняется приложение на Go. Необходимо учитывать переходы на летнее/зимнее время, так как некоторые моменты времени могут не существовать или повторяться.

8. Безопасность Потоков и Синхронизация

Библиотека cron разработана с учетом безопасности потоков и параллельности. Важно, чтобы вызывающая сторона поддерживала правильный порядок вызовов методов, чтобы избежать гонок. При необходимости необходимо использовать соответствующие механизмы синхронизации, чтобы гарантировать правильное планирование и выполнение задач.