在 linux 中,我们可以定义 cron 任务,只需要:
* * * * * cmd args # 分 时 日 月 周
e.g.
*/10 * * * * echo "I love coding"
在 goalng 中,我们也可以通过 cron 第三方包实现定时任务,在日常开发中,难免遇到一些定时任务的需求,这个库是可以用上的。
安装第三方库:
go get github.com/robfig/cron/v3
这里我们用的 v3 版本,与旧版本的区别是将精度调低到 second 级别,不过需要传入相关参数实现。
下面我们就 cron 的使用做个简短的示例。
根据需求定义定时时间,然后命名任务注入,start后通过 sleep 休眠阻塞住。
运行分钟级别任务:
func myCron() {
c := cron.New()
entryID, _ := c.AddFunc("*/1 * * * *", func() {
fmt.Println(time.Now(), "每1min执行一次")
})
fmt.Println(time.Now(), entryID)
c.Start()
time.Sleep(1*time.Hour)
}
运行秒级的定时任务:
func myCron() {
c := cron.New(cron.WithSeconds())
entryID, _ := c.AddFunc("*/10 * * * * *", func() {
fmt.Println(time.Now(), "每10s执行一次")
})
fmt.Println(time.Now(), entryID)
c.Start()
time.Sleep(1*time.Hour)
}
运行多任务:
type Job1 struct {
}
func (j Job1) Run() {
fmt.Println(time.Now(), "每1分钟执行1次")
}
type Job2 struct {
}
func (j Job2) Run() {
fmt.Println(time.Now(), "每2分钟执行一次")
}
func runCronJobs() {
c := cron.New()
entryID, _ := c.AddJob("*/1 * * * *", Job1{})
fmt.Println(time.Now(), entryID)
entryID, _ = c.AddJob("*/2 * * * *", Job2{})
fmt.Println(time.Now(), entryID)
c.Start()
time.Sleep(1*time.Hour)
}
注意
在注入 cron.AddJob() 参数时,我们如果另外定义的话,需要实现 Job 接口:
// Job is an interface for submitted cron jobs.
type Job interface {
Run()
}
所以我们通过 Job1 Job2 来实现 Job接口并注入到 job 中。
cron/v3 的使用很简单,需要的直接拿去用吧。
参考: