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 разработана с учетом безопасности потоков и параллельности. Важно, чтобы вызывающая сторона поддерживала правильный порядок вызовов методов, чтобы избежать гонок. При необходимости необходимо использовать соответствующие механизмы синхронизации, чтобы гарантировать правильное планирование и выполнение задач.