Go语言中定时器cron的基本使用教程

栏目: 编程语言 · Go · 发布时间: 6年前

内容简介:这篇文章主要给大家介绍了关于Go语言中定时器cron使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

cron是什么

cron的意思就是:计划任务,说白了就是定时任务。我和系统约个时间,你在几点几分几秒或者每隔几分钟跑一个任务(job),就那么简单。

前言

cron 是 robfig 开发的一个定时作业库,robfig 总是想的比别人早,给了我们这些 Gopher 不少急需的东西,想当年 revel 的出现也是这样的。看看 cron 的使用,还是一如既往的简洁明了,发现 Go 的世界里,有些产品还是有鲜明的个人特质的,那就是所谓的个人魅力吧?!

总之 robfig 开发的产品都是有一定超前性,比较有理论基础,使用起来很简单的东西。

下面看看怎么用 cron 吧:

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()

首先实例化一个 cron 对象 c,然后调用实例 c 的 AddFunc 函数,AddFunc 函数接收一个定时表达式和一个普通函数,最后开始执行实例,定时作业就好了。

首先接收的普通函数,就是我们业务的东西了,比如我们想打印 Hello World! 一行字符串,我们这么写这样的函数:

func PrintSomeWord(){
fmt.Sprint("Hello World!")
}

PrintSomeWord 写好了,接下来想每秒钟打印一次,这时 cron 就派上用场了:

c := cron.New()
c.AddFunc("@every 1s",PrintSomeWord)
c.Start()

这么说来,普通函数是随我们的业务决定的,我们暂且不谈了,而定时表达式才是我们要学习的东西。我们从 cron 的名字,很容易联想到 Linux 系统的 cron 定时器来,它们是不是存在一定的关系呢?从下面的使用情况来看,答案是的。仔细看它们的定时表达式是非常相似的,这样就好办了,大大降低了使用 cron 的门槛,毕竟 Linux 的 cron 是一个标准来的。

我们看看 cron 普通的表达式:

c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") })
c.AddFunc("@daily", func() { fmt.Println("Every day") })
c.AddFunc("@hourly", func() { fmt.Println("Every hour") })

这三行代码的定时表达式分别表示:每1小时30分钟执行一次,每天执行一次,每小时执行一次。

@every 很广,修改后缀,就可以表示不同的用途,比如 秒 分 小时 天,看看代码:

@every 1s
@every 1m
@every 1h
@every 1d

怎么样很有规律吧?

更往深一点,可能就是嫌弃 @every 还不够简洁了,比如:

@every 1h
@every 1d
@every 30d

每小时 每天 每月 完全可以不用后缀了:

@hourly
@daily
@monthly

当然简洁是好的,但简洁的同时往往也有些无法做到简洁的情况,比如上面提到的:

@every 1h30m

不用后缀是不行了吧?

最不好理解的可能是以下的表达式了,因为看这种表达式,就好比看一堆正则表达式一样,让一般人懵逼:

c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") })

定时表达式 0 30 * * * * 到底是什么意思啊?第一印象,毫无规律性,不知道什么意思,如果翻译 Every hour on the half hour 这句洋文,倒是有点概念了,意思就是“每一小时半(1.5个小时)执行一次” 嘛!!!

额,看到0 30和六个占位数,推理一下:是不是 秒 分 时 天 月 年 啊?似乎有眉毛了,我也想知道这个表达式的具体使用办法,只能下次认真学习后,一起说道说道了。

Go 定时器 cron 表达式的使用

如果想更灵活的使用定时,可能会涉及到更复杂的六位表达式的使用方法,如每半小时执行一次:

0 30 * * * *

六位的表达式看起来,有点费解,好比正则表达式一样,我们需要按步骤来理解;

理解六个作用域的意义

0 0 0 1 1 *
0 0 0 1 * *
0 0 0 * * 0
0 0 0 * * *
0 0 * * * *

如上表达式,都是六位占位符,可以是数字和字符,其中字符是特定字符包括:【* / , - ? JAN-DEC SUN-SAT】

我们叫它为六个作用域吧,从左到右的顺序,代表的含义是 秒钟域(1) 分钟域(2) 小时域(3) 日期域(4) 月份域(5) 星期域(6)

月份域可以使用 JAN-DEC 和星期域可以使用SUN-SAT,分别表示 1-12月的英文缩写和星期一至星期日的英文简写,如果不了解月份和星期英文简写,建议使用数字表示,因为这个需要记忆和大小写敏感的,容易出错。

下面列出方便理解:

1至12月份的英文简写:Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec

星期一至星期日的英文简写:Mon Tues Wed Thurs Fri Sat Sun

六个作用域还可以使用的特定字符:

特定字符星号( *)

星号表示匹配所有合理的值,可以存在任何域。比如第月份域(5)的位置使用星号*,表示每个月都执行;同理在星期域(6)的位置使用星号,表示每个星期都执行;其他占位使用它以此类推。

特定字符斜划线 (/)

斜划线通常用于一个范围增量,可以存在任何域。比如在分钟域(2)的位置使用 3-59/15 表示一个小时的第3分钟到59分钟时间范围内,每15分钟执行一次。

特定字符逗号 (,)

逗号用于分隔多个点,可以存在任何域。比如在星期域(6)的位置使用 MON,WED,FRI 表示星期一、星期三、星期五这三个点都满足条件。

特定字符中横杠 (-)

中横杠通常用于定义范围,可以存在任何域。 例如小时域(3)的位置使用 9-17 表示起始9点到截止17点这个时间段范围。

特定字符问号 (?)

问号表示不确定一个点的意思,只能在日期域(4) 星期域(6)的位置使用,表示指定的值不确定性,一个表达式中只能用一次问号?,如果在日期域(4)使用了,就不能再星期域(6)上用了。它和星号是有区别的,星号表示匹配所有点,就是说一个月哪一天,哪个星期都可以,而问号,表示一个月的不确定哪一天或是一周不确定哪一天都行,这个是很难理解的,需要说一些具体的情况来解释,比如2月的第18天,刚好是第三周的第2天,那么如果在日期域(4)定义18,星期域(6)定义2这样就重叠定义了,这个 cron 是不允许的。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对Codercto.com的支持。


以上所述就是小编给大家介绍的《Go语言中定时器cron的基本使用教程》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

ANSI Common Lisp

ANSI Common Lisp

Paul Graham / Prentice Hall / 1995-11-12 / USD 116.40

For use as a core text supplement in any course covering common LISP such as Artificial Intelligence or Concepts of Programming Languages. Teaching students new and more powerful ways of thinking abo......一起来看看 《ANSI Common Lisp》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

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

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具