golang定时任务之cron
简介
服务器应用中,定时任务是常见的业务需求。一些清理动作、统计、重试等耗时长、占用资源多的应用,期望在业务低峰期定时执行。通常根据需求,分为每天/每周/每月执行。cron是golang中广泛使用的一个开源项目
demo try
package main
import (
"fmt"
"time"
"github.com/robfig/cron/v3"
)
func main() {
c := cron.New()
c.AddFunc("@every 5s", func() {
fmt.Println(time.Now(), "run every 5 second")
})
c.AddFunc("4 * * * ?", func() {
fmt.Println(time.Now(), "run minute 4 every hour")
})
c.Start()
select {}
}
输出:
2024-01-23 22:03:30.001179 +0800 CST m=+4.163984251 run every 5 second
2024-01-23 22:03:35.000493 +0800 CST m=+9.163356209 run every 5 second
2024-01-23 22:03:40.001159 +0800 CST m=+14.164079876 run every 5 second
2024-01-23 22:03:45.001147 +0800 CST m=+19.164125626 run every 5 second
2024-01-23 22:03:50.001245 +0800 CST m=+24.164280209 run every 5 second
2024-01-23 22:03:55.001376 +0800 CST m=+29.164468959 run every 5 second
2024-01-23 22:04:00.004014 +0800 CST m=+34.167164418 run minute 4 every hour
2024-01-23 22:04:00.004155 +0800 CST m=+34.167305751 run every 5 second
2024-01-23 22:04:05.001184 +0800 CST m=+39.164391918 run every 5 second
一探究竟
类图
cron
Cron是主类,其中主要属性:
Cron提供的主要方法:
定时任务的调度机制
当调用Cron.Start()方法后,会调用Cron.run()
// Figure out the next activation times for each entry.
now := c.now()
for _, entry := range c.entries {
entry.Next = entry.Schedule.Next(now)
c.logger.Info("schedule", "now", now, "entry", entry.ID, "next", entry.Next)
}
sort.Sort(byTime(c.entries))
case newEntry := <-c.add:
timer.Stop()
now = c.now()
newEntry.Next = newEntry.Schedule.Next(now)
c.entries = append(c.entries, newEntry)
c.logger.Info("added", "now", now, "entry", newEntry.ID, "next", newEntry.Next)
case replyChan := <-c.snapshot:
replyChan <- c.entrySnapshot()
continue
case <-c.stop:
timer.Stop()
c.logger.Info("stop")
return
case id := <-c.remove:
timer.Stop()
now = c.now()
c.removeEntry(id)
c.logger.Info("removed", "entry", id)
case now = <-timer.C:
now = now.In(c.location)
c.logger.Info("wake", "now", now)
// Run every entry whose next time was less than now
for _, e := range c.entries {
if e.Next.After(now) || e.Next.IsZero() {
break
}
c.startJob(e.WrappedJob)
e.Prev = e.Next
e.Next = e.Schedule.Next(now)
c.logger.Info("run", "now", now, "entry", e.ID, "next", e.Next)
}
c.jobWaiter.Add(1)
go func() {
defer c.jobWaiter.Done()
j.Run()
}()
配置项
cron提供了一些常用配置项,供开发者自行设置
总结
整体来说,cron通过简单清晰的任务调度机制,实现了定时任务的执行。同时,也提供了丰富的定制化功能。使用者可以根据自身需要进行扩展。
转载自:https://juejin.cn/post/7330904102023036955