golang 通过cron实现定时任务

143 阅读1分钟

在 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 的使用很简单,需要的直接拿去用吧。

参考:

1.Golang 定时任务cron最新版