why
在应用开发中,经常需要一些周期性的操作,如:在每天凌晨分析前一天的日志、每隔5分钟检查某些业务情况并触发告警等等。这些功能需要使用定时任务的方法去实现,那我们是如何使用 Golang 去实现的呢?
what
推荐使用 github 上的 Golang 开源库来实现定时任务,介绍两个常用的库:robfig/cron 和 jasonlvhit/gocron
- robfig/cron:说到定时任务,会想到 crontab,其常见于Unix和类Unix的操作系统之中。robfig/cron 库使用了类 crontab 的方式来执行定时任务。
- jasonlvhit/gocron:类 crontab 的设置方式可能并不友好,jasonlvhit/gocron 提供了更为人性化的执行方式。
至于选取哪个?熟悉 crontab 的可以选择 cron,想可读性佳的可以选择 gocron,两者的功能及稳定性都还不错。
如果需要开箱即用的定时任务管理系统(前后端),推荐国人开源的 ouqiang/gocron Star & Fork 数 Σ(o゚д゚oノ)
gocron
- 安装 go get -u github.com/jasonlvhit/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()
}
作者:Faye
链接:https://juejin.cn/post/6917489009140695053
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。