Why
При разработке приложений часто требуются некоторые периодические операции, такие как: анализ журналов предыдущего дня каждое утро, проверка определенных бизнес-условий каждые 5 минут и срабатывание сигналов тревоги и т. д. Эти функции должны быть реализованы с помощью задач на время, так как же мы реализуем их с помощью Golang?
What
Рекомендуется использовать библиотеку с открытым исходным кодом Golang на github для реализации задач синхронизации и ввести две часто используемые библиотеки: robfig/cron и jasonlvhit/gocron.
-
robfig/cron: Когда дело доходит до задач на время, это приходит на ум
crontab
, который распространен в Unix и Unix-подобных операционных системах. Библиотека robfig/cron использует подход, подобный crontab, для выполнения запланированных задач. - jasonlvhit/gocron: метод настройки класса crontab может быть недружелюбным, jasonlvhit/gocron обеспечивает более гуманный метод выполнения.
Что же выбрать? Те, кто знаком с crontab, могут выбрать cron, а те, кто хочет лучшей читабельности, могут выбрать gocron, оба из которых имеют хорошие функции и стабильность.
Если нужноВстроенная система управления задачами по расписанию(front-end и back-end), рекомендуется китайский с открытым исходным кодомouqiang/gocronНомер звезды и вилки Σ(o゚д゚oノ)
Это то, что в настоящее время использует отдел, и это все еще очень удобно~ (づ。◕‿‿◕。)づ README автора очень понятен, поэтому я не буду его здесь представлять.
How
Ниже краткое введение в использование robfig/cron и jasonlvhit/gocron.
cron
Установить go get -u github.com/robfig/cron
Demo
package main
import (
"log"
"github.com/robfig/cron"
)
func main() {
i := 0
c := cron.New()
spec := "*/5 * * * *"
c.AddFunc(spec, func() {
i++
log.Println("execute per 5 seconds", i)
})
c.Start()
select {}
}
Результаты выполнения следующие (описание кода: выполняется каждые 5 секунд, i накапливается, записывается и печатается):
Среди них использование select: функция выбора golang похожа на select, poll и epoll, то есть для мониторинга операций ввода-вывода и запуска соответствующих действий при выполнении операций ввода-вывода.
Точно так же, если вам нужно выполнять каждую минуту, гдеspec := "0 */1 * * * *"
Просто измените его, люди, которые знают crontab, должны быть знакомы с его форматом выражения. Обобщенно следующим образом:
имя поля | Это необходимо | допустимые значения | разрешены определенные символы |
---|---|---|---|
Секунды | да | 0-59 | * / , – |
Минуты | да | 0-59 | * / , – |
Часы | да | 0-23 | * / , – |
День месяца | да | 1-31 | * / , – ? |
Месяц | да | 1-12 or JAN-DEC | * / , – |
День недели | да | 0-6 or SUM-SAT | * / , – ? |
Примечание:
- Значения сегментов месяца и недели не чувствительны к регистру, например: SUN, Sun и sun одинаковы.
- Предыдущая версия поля «День недели» кажется необязательной, по умолчанию * — текущая версия.
описание специального символа
- Звездочка ( * ): указывает, что выражение cron может соответствовать всем значениям поля.
- Косая черта ( / ): указывает интервал роста, например:
spec := "*/5 * * * * *"
- Запятая ( , ): используется для перечисления значений. Например, значение шестого поля — ПН, СРЕ, ПТ, что означает выполнение в понедельник, среду и пятницу; другой пример:
spec := "* 0,59 1 * * *"
, что означает, что он выполняется каждую секунду в 01:00 и 01:59 каждый день - Дефис (-): указывает диапазон, например, значение 3-го поля 9-17 означает с 9:00 до 17:00 непосредственно каждый час (включая 9 и 17)
- Вопросительный знак ( ? ): используется только для дня месяца и дня недели, указывая на то, что значение не указано, может использоваться вместо *
Вы также можете использовать некоторые предустановленные таймеры для облегчения выполнения, например:
Entry | Description | Equivalent To |
---|---|---|
@yearly (or @annually) | Запуск раз в год, в полночь, 1 января. | 0 0 0 1 1 * |
@monthly | Запуск раз в месяц, в полночь, первого числа месяца | 0 0 0 1 * * |
@weekly | Запуск раз в неделю, в полночь между субботой и воскресеньем | 0 0 0 * * 0 |
@daily (or @midnight) | Запускать раз в день, в полночь | 0 0 0 * * * |
@hourly | Запуск раз в час, начало часа | 0 0 * * * * |
Больше ссылок:перейдите на doc.org/GitHub.com/…
gocron
Установить go get -u github.com/jasonlvhit/gocron
Demo
package main
import (
"log"
"github.com/jasonlvhit/gocron"
)
func main() {
i := 0
s := gocron.NewScheduler()
s.Every(5).Seconds().Do(func() {
i++
log.Println("execute per 5 seconds", i)
})
<-s.Start()
}
Эффект от исполнения следующий:
Выше приведены основные методы использования таймера.Именование и использование интерфейса gocron относительно удобны для пользователя и могут быть прочитаны напрямую.Пожалуйста, обратитесь к следующим официальным примерам:
package main
import (
"fmt"
"github.com/jasonlvhit/gocron"
)
func task() {
fmt.Println("I am runnning task.")
}
func taskWithParams(a int, b string) {
fmt.Println(a, b)
}
func main() {
// Do jobs with params
gocron.Every(1).Second().Do(taskWithParams, 1, "hello")
// Do jobs safely, preventing an unexpected panic from bubbling up
gocron.Every(1).Second().DoSafely(taskWithParams, 1, "hello")
// Do jobs without params
gocron.Every(1).Second().Do(task)
gocron.Every(2).Seconds().Do(task)
gocron.Every(1).Minute().Do(task)
gocron.Every(2).Minutes().Do(task)
gocron.Every(1).Hour().Do(task)
gocron.Every(2).Hours().Do(task)
gocron.Every(1).Day().Do(task)
gocron.Every(2).Days().Do(task)
// Do jobs on specific weekday
gocron.Every(1).Monday().Do(task)
gocron.Every(1).Thursday().Do(task)
// function At() take a string like 'hour:min'
gocron.Every(1).Day().At("10:30").Do(task)
gocron.Every(1).Monday().At("18:30").Do(task)
// remove, clear and next_run
_, time := gocron.NextRun()
fmt.Println(time)
gocron.Remove(task)
gocron.Clear()
// function Start start all the pending jobs
<- gocron.Start()
// also, you can create a new scheduler
// to run two schedulers concurrently
s := gocron.NewScheduler()
s.Every(3).Seconds().Do(task)
<- s.Start()
}
Больше ссылок:перейдите на doc.org/GitHub.com/…