Go语言中定时器cron的基本使用教程
来源:脚本之家
时间:2023-01-07 12:12:04 274浏览 收藏
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《Go语言中定时器cron的基本使用教程》,介绍一下cron、go语言定时器,希望对大家的知识积累有所帮助,助力实战开发!
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 是不允许的。
总结
今天关于《Go语言中定时器cron的基本使用教程》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
-
190 收藏
-
208 收藏
-
250 收藏
-
309 收藏
-
324 收藏
-
134 收藏
-
188 收藏
-
480 收藏
-
241 收藏
-
409 收藏
-
213 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 507次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习
-
- 风趣的豌豆
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢老哥分享博文!
- 2023-03-26 08:29:39
-
- 靓丽的麦片
- 这篇技术贴出现的刚刚好,好细啊,太给力了,码住,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-02-12 09:43:53
-
- 魔幻的乌冬面
- 写的不错,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢大佬分享技术文章!
- 2023-02-10 14:18:46
-
- 香蕉黑夜
- 太详细了,码起来,感谢作者大大的这篇博文,我会继续支持!
- 2023-01-17 06:45:41
-
- 害怕的老虎
- 这篇文章太及时了,太详细了,太给力了,码起来,关注楼主了!希望楼主能多写Golang相关的文章。
- 2023-01-08 21:31:09