Golang реализует временные задачи | семидневный удар

Go
Golang реализует временные задачи | семидневный удар

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 накапливается, записывается и печатается):cron demo

Среди них использование 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 * / , – ?

Примечание:

  1. Значения сегментов месяца и недели не чувствительны к регистру, например: SUN, Sun и sun одинаковы.
  2. Предыдущая версия поля «День недели» кажется необязательной, по умолчанию * — текущая версия.

описание специального символа

  1. Звездочка ( * ): указывает, что выражение cron может соответствовать всем значениям поля.
  2. Косая черта ( / ): указывает интервал роста, например:spec := "*/5 * * * * *" 
  3. Запятая ( , ): используется для перечисления значений. Например, значение шестого поля — ПН, СРЕ, ПТ, что означает выполнение в понедельник, среду и пятницу; другой пример:spec := "* 0,59 1 * * *", что означает, что он выполняется каждую секунду в 01:00 и 01:59 каждый день
  4. Дефис (-): указывает диапазон, например, значение 3-го поля 9-17 означает с 9:00 до 17:00 непосредственно каждый час (включая 9 и 17)
  5. Вопросительный знак ( ? ): используется только для дня месяца и дня недели, указывая на то, что значение не указано, может использоваться вместо *

Вы также можете использовать некоторые предустановленные таймеры для облегчения выполнения, например:

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 demo

Выше приведены основные методы использования таймера.Именование и использование интерфейса 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/…