定时任务实现 | 青训营笔记

355 阅读2分钟

如何使用GO设置一个定时任务

由于在我负责的模块中需要定时持久化进数据库,那么这个定时任务该如何设置呢,设置时间为多久,或者是什么时候开始这个定时任务呢?

定时任务使用 goCron 包

首先要引入包 go get -u "github.com/robfig/cron"

下面看一组样例如何设置 定时任务的时间

// 每隔1秒执行一次 */1 * * * * ?

// 每隔1分钟执行一次 0 */1 * * * ?

// 每天0点执行一次 0 0 0 * * ?

// 每月1号凌晨1点执行一次 0 0 1 1 * ?

// 在1分、2分、3分执行一次 0 1,2,3 * * * ?

// 每天的0点、1点、2点执行一次 0 0 0,1,2 * * ?

示例代码:

package main
 
import (
	"github.com/robfig/cron"
	"log"
)
 
func CreateCron() {
	i := 0
    //初始化一个定时任务
	c := cron.New()
    //定义时间表达式,这里的含义是每隔5秒钟执行一次
	spec := "*/5 * * * * ?"
    //给初始化的定时任务指定时间表达式和具体执行的函数,这里写了一个匿名函数,功能是输出cron running: 数字
	if err := c.AddFunc(spec, func() {
		i++
		log.Println("cron running:", i)
	}); err != nil {
		log.Println(err)
	}
    //运行定时任务
	c.Start()
}
 
func main(){
    CreateCron()
    // for循环让进程不要退出,这样可以看到定时任务函数的输出
    for {}
}

如果你只是想设置一个间隔几小时或间隔几分钟 来执行一次定时任务的话 ,那么还有更加简便的方法,即把时间表达式spec 变成 @every xxx 每5秒执行一次则是@every 5s 每5小时执行一次则是 @every 5h但是这种方法的缺陷也很明显,就是该定时任务的执行 取决于你开启定时任务进程的时间。那么如果你想要在每日的某个时间点进行定时任务的执行,那么就只能用第一种设置时间表达式的方法,或者在每日的那个时间开启定时任务进程(但这样显然很麻烦且容易不准确)