目录
  • 前言
  • 快速开始
    • 安装
    • 导入
    • Demo
  • Cron表达式格式
    • 标准格式
    • 预定义时间表
  • 常用的方法介绍
    • new()
    • AddJob()
    • AddFunc()
    • Start()
  • 相关推荐
    • Go第三方库之cronexpr——解析 crontab 表达式
  • 总结

    前言

    在平时的开发需求中,我们经常会有一些重复执行的操作需要触发执行,和系统约个时间,在几点几分几秒或者每隔几分钟跑一个任务,说白了就是定时任务,,想必大家第一反应都是linux的Crontab。其实定时任务不止使用系统自带的Crontab,在Go语言中也可以使用Cron定时任务库, 这篇文章给大家介绍如何在go项目中实现一个crontab功能,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

    golang 实现定时服务很简单,只需要简单几步代码便可以完成,不需要配置繁琐的服务器,直接在代码中实现。

    使用 github.com/robfig/cron 这个包,robfig/cron是一个第三方开源的任务调度库,也就是我们平时说的定时任务,它实现了 cron 规范解析器和任务运行器。

    快速开始

    安装

    go get github.com/robfig/cron/v3@v3.0.0
    

    导入

    import "github.com/robfig/cron/v3"

    Demo

    package main
    
    import (
    	"fmt"
    	"github.com/robfig/cron/v3"
    )
    
    func main() {
    	// 创建一个默认的cron对象
        c := cron.New()
        
        //添加执行任务
    	c.AddFunc("30 * * * *", func() { fmt.Println("Every hour on the half hour") })
    	c.AddFunc("@hourly", func() { fmt.Println("Every hour, starting an hour from now") })
    	c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty, starting an hour thirty from now") })
    	
        //开始执行任务
        c.Start()
    	select {} //阻塞
    }

    Cron表达式格式

    标准格式

    一个 cron 表达式表示一组时间,使用 5 个空格分隔的字段。这是v3版本默认支持的格式,没有Seconds。在v3版本中也支持秒级别的解析,需要自定义解析器。

    Field name   | Mandatory? | Allowed values  | Allowed special characters
    ----------   | ---------- | --------------  | --------------------------
    Seconds      | Yes        | 0-59            | * / , -
    Minutes      | Yes        | 0-59            | * / , -
    Hours        | Yes        | 0-23            | * / , -
    Day of month | Yes        | 1-31            | * / , - ?
    Month        | Yes        | 1-12 or JAN-DEC | * / , -
    Day of week  | Yes        | 0-6 or SUN-SAT  | * / , - ?
    

    预定义时间表

    可以用@yearly@monthly@weekly@weekly@daily@hourly来替代cron表达式。分别表示每年,每月、每星期、每天、每小时。

    还可以用@every <duartion>来表示间隔时间,即间隔执行一次任务。只要可以被time.ParseDuration()解析即可。

    常用的方法介绍

    new()

    会根据本地时间创建一个新(空白)的计划任务实例

    // 创建一个默认的cron对象
    cron.New()
    
    // 自定义解析器
    cron.New(cron.WithSeconds())
    
    // Seconds field, optional
    cron.New(cron.WithParser(cron.NewParser(
        cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor,
    )))
    

    AddJob()

    // 有两个参数,第一个参数可以是cron表达式或者预定义时间表,第二个Job
    func (c *Cron) AddJob(spec string, cmd Job) (EntryID, error)
    
    // Job是一个接口,有一个Run方法
    type Job interface {
    	Run()
    }

    AddFunc()

    会向计划任务实例中添加一个回调函数,按指定时间表执行回调函数。

    // 有两个参数,第一个参数可以是cron表达式或者预定义时间表,第二个传入一个函数,就是要执行的任务
    // 会返回一个Id和error
    // 会把传入的cmd func转成FuncJob。FuncJob实现了Job接口
    func (c *Cron) AddFunc(spec string, cmd func()) (EntryID, error) {
    	return c.AddJob(spec, FuncJob(cmd))
    }

    Start()

    调用start方法开始执行任务

    相关推荐

    Go第三方库之cronexpr——解析 crontab 表达式

    cronexpr 是一个 crontab 解析表达式的库,我们可以根据当前时间获取到下次执行的时间。具体用法如下:

    go get github.com/gorhill/cronexpr //下载
    import "github.com/gorhill/cronexpr" //导入
    

    demo:

    package main
    
    import (
    	"fmt"
    	"time"
    
    	"github.com/gorhill/cronexpr"
    )
    
    func doTask() {
    	fmt.Println("I am running, time is: ", time.Now())
    }
    func main() {
    
    	// 每隔 5 秒执行1次
    	expr, err := cronexpr.Parse("*/10 * * * * * * ") // 如果表达式解析错误将返回一个错误
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
        
        //获取下次执行时间
    	nextTime := expr.Next(time.Now()) 
    	fmt.Println(nextTime)
    
    	time.AfterFunc(time.Until(nextTime), doTask)
        
        //返回当前crontab后的5次执行,n为次数
        nextTimeList = cronexpr.MustParse("*/10 * * * * * * ").NextN(time.Now(), 5)
        for _, v := range nextTimeList {
            fmt.Println(v.String())
        } 
        
    	time.Sleep(10 * time.Second)
    
    }

    总结

    定时任务很常见,希望你通过本文能够熟知 Golang 怎么实现一个简单的定时任务调度管理

    可以不依赖系统的 Crontab 设置,指不定哪一天就用上了。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。