golang cron定时任务简单实现

栏目: Go · 发布时间: 6年前

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

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

使用 https://github.com/robfig/cron 这个包,它实现了 cron 规范解析器和任务运行器。

cron 介绍

参见: https://godoc.org/github.com/robfig/cron

用法

注册在指定时间上运行的函数,cron 将会在协程中运行这些注册函数。AddFunc 函数第一个参数指定定时任务时间间隔,第二个参数指定运行函数。

c := cron.New()
c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })
c.AddFunc("@hourly",      func() { fmt.Println("Every hour") })
c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") })
c.Start()
..
// 函数将在它们自己的goroutine中异步调用
...
// 也可以在运行的Cron中添加任务
c.AddFunc("@daily", func() { fmt.Println("Every day") })
..
// 检查cron任务条目的下一个和上一个运行时间
inspect(c.Entries())
..
c.Stop()  // 停止定时任务(不停止已经运行的任务)

Cron 表达式格式

字段名 是否必须 取值范围 特殊字符串
秒(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 * / , - ?

注意:月和星期字段值不区分大小写。'SUN'、'Sun'和'sun'都是一样的

特殊字符说明

星号(*)

星号表示cron表达式将匹配该字段的所有值,比如,在上面表达式'月'中使用星号,就表示每个月

斜线(/)

斜杠用于描述范围的增量,比如'3-59/15'这个表达式在表示从现在的第三分钟开始和往后的每15分钟,到第59分钟为止。表现形式为"* \ / ...",等同于"N-MAX / m",即在该字段范围内的增量。即从N开始,使用增量 m 直到 MAX 结束,它没有重复

逗号(,)

逗号用于分隔列表中的项,比如,在上表的'星期几'中使用 "MON,WED,FRI" 表示星期一、星期三和星期五

连字符 (-)

连字符用于定义范围。例如,9-17表示包括上午9点至下午5点在内的每小时

问好 (?)

表示不指定值,可以来代替 "*"

预定义的时间格式

您可以使用几个预定义的表达式来代替上表的表达式

输入 描述 等式
@yearly (or @annually) 每年1月1日午夜跑步一次 0 0 0 1 1 *
@monthly 每个月第一天的午夜跑一次 0 0 0 1 * *
@weekly 每周周六的午夜运行一次 0 0 0 * * 0
@daily (or @midnight) 每天午夜跑一次 0 0 0 * * *
@hourly 每小时运行一次 0 0 * * * *

使用说明

从github下载cron的包到本地库或者加入道自己的项目中引用都可以,包中有多个测试用例,可以参考它们的用法

golang cron定时任务简单实现

cron包

代码实现

代码很简单,只要几行即可实现,下面是一个简单使用的示例,说明见代码注释:

package main

import (
    "demo/cron"
    "log"
    "time"
)

func main() {
    log.Println("Starting...")

    // 定义一个cron运行器
    c := cron.New()
    // 定时5秒,每5秒执行print5
    c.AddFunc("*/5 * * * * *", print5)
    // 定时15秒,每5秒执行print5
    c.AddFunc("*/15 * * * * *", print15)

    // 开始
    c.Start()
    defer c.Stop()

    // 这是一个使用time包实现的定时器,与cron做对比
    t1 := time.NewTimer(time.Second * 10)
    for {
        select {
        case <-t1.C:
            t1.Reset(time.Second * 10)
            print10()
        }
    }
}

func print5() {
    log.Println("Run 5s cron")
}

func print10() {
    log.Println("Run 10s cron")
}

func print15() {
    log.Println("Run 15s cron")
}

运行结果

可以看出time包形式的定时器是以程序启动时间为准的,而cron的定时有表达式决定,两者都实现了定时器效果,一般程序中也够用了

golang cron定时任务简单实现

cron

以上就是基于golang的cron的基本使用了


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Software Engineering for Internet Applications

Software Engineering for Internet Applications

Eve Andersson、Philip Greenspun、Andrew Grumet / The MIT Press / 2006-03-06 / USD 35.00

After completing this self-contained course on server-based Internet applications software, students who start with only the knowledge of how to write and debug a computer program will have learned ho......一起来看看 《Software Engineering for Internet Applications》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具