编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Go 定时器 cron 的使用(go语言定时器)

wxchong 2024-07-19 06:07:25 开源技术 13 ℃ 0 评论

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 这句洋文,倒是有点概念了,意思就是“一小时里每30分钟执行一次” 嘛!!!

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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表