Есть ли способ делать повторяющиеся фоновые задачи в Go? Я думаю о чем-то похожем Timer.schedule(task, delay, period)
на Java. Я знаю, что могу сделать это с помощью рутины и Time.sleep()
, но я хотел бы что-то, что легко остановилось.
Вот что я получил, но выглядит мне некрасиво. Есть ли чище / лучше?
func oneWay() {
var f func()
var t *time.Timer
f = func () {
fmt.Println("doing stuff")
t = time.AfterFunc(time.Duration(5) * time.Second, f)
}
t = time.AfterFunc(time.Duration(5) * time.Second, f)
defer t.Stop()
//simulate doing stuff
time.Sleep(time.Minute)
}
t := time.Tick(time.Duration(period) * time.Second)
когда периодint
Ответы:
Функция
time.NewTicker
создает канал, который отправляет периодическое сообщение, и предоставляет способ остановить его. Используйте это как-то так (не проверено):Вы можете остановить рабочий, закрывая
quit
канал:close(quit)
.источник
do stuff
процедуру go, иначе следующий рабочий выполнит немедленно (при необходимости более 5 секунд).close(quit)
тогда, когда вы хотите остановить планировщик.go func() { /*do stuff */ }()
.Как насчет чего-то вроде
Игровая площадка
источник
time.Ticker
Лучше , чемtime.After
где вы предпочли бы сохранить задачу по графике против произвольного разрыва между казнями.If efficiency is a concern, use NewTimer
Если вас не интересует смещение тиков (в зависимости от того, сколько времени это занимало ранее при каждом выполнении) и вы не хотите использовать каналы, можно использовать встроенную функцию диапазона.
т.е.
Игровая площадка
источник
Проверьте эту библиотеку: https://github.com/robfig/cron
Пример как ниже:
источник
Более широкий ответ на этот вопрос мог бы рассмотреть подход Lego Brick, часто используемый в Occam и предлагаемый сообществу Java через JCSP . По этой идее Питер Уэлч сделал очень хорошую презентацию .
Этот подход «подключи и работай» переводится непосредственно в Go, потому что Go использует те же самые основы последовательного процесса связи, что и Occam.
Таким образом, когда речь идет о разработке повторяющихся задач, вы можете построить свою систему как сеть потоков данных из простых компонентов (таких как программы), которые обмениваются событиями (например, сообщениями или сигналами) по каналам.
Этот подход композиционный: каждая группа небольших компонентов может вести себя как большой компонент до бесконечности. Это может быть очень мощным, потому что сложные параллельные системы сделаны из простых для понимания кирпичей.
Сноска: в презентации Уэлча он использует синтаксис Оккама для каналов, а это ! а ? и они прямо соответствуют ch <- и <-ch в Go.
источник
Я использую следующий код:
Это более просто и прекрасно работает для меня.
источник
Если вы хотите , чтобы остановить его в любой момент тикер
Если вы не хотите, чтобы остановить это, отметьте :
источник