这篇文章介绍两种golang中常用的定时器使用方法,一种是常用的cron定时任务,另一种则是time包中的几种类型,前者是第三方开源,因此需要import "github.com/robfig/cron"。至于原理,留待以后研究补充。

Cron定时任务

robfig/cron已在github上收获8.9k个star,目前已发布V3版本,显而易见,它是一个非常好用且功能强大的定时任务库,与原生的golang中的Timer不同的是,它使用任务表达式来定时。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import(
"fmt"
"github.com/robfig/cron"
)

func main(){
myCron := cron.New()
//设置定时时间为5秒
spec := "0/5 * * * * *"
myCron.AddFunc(spec,func(){
//TO DO
fmt.Println("每五秒打印一次")
})
//另起协程
myCron.Start()

select{}
}

显然,使用起来非常简单。

关于定时表达式,表达式(* * * * * *)中的六个字段从左到右为:秒,分,时,天,月,星期。说明如下:

字段 取值范围 特殊字符
0-59 * / , - ?
0-59 * / , - ?
0-23 * / , - ?
1-31 * / , - ?
1-12或JAN-DEC * / , - ?
星期 0-6或SUN-SAT * / , - ?

特殊字符使用规则:

字符 字符作用 举例 含义
* 与该字段所有值匹配 0 30 * * * * * 每小时的30分0秒执行一次
/ 定义范围的增量 */5 * * * * * 每五秒执行一次
, 分隔多个时间 MON,WED,FRI 每周一,周三,周五执行
- 定义范围 * * * * 1-3 * * 从一月到三月的每个月
只用于字段“日”和“星期” 0 0 23 * * ? 每天23点执行一次

更加详细的官方说明参见文档

Timer对象

Timer是一种特殊的计时器,首先在程序中使用time.NewTimer()方法指定时间,在程序运行中到达该时间后,就将当前时间发送到其C字段中。

它主要用在异步编程中处理操作超时行为,在C字段读到Time实例前,所有等待的协程都会被阻止。

虽然功能不如corn,但它的使用方式也很简单:

1
2
3
4
5
6
7
8
9
10
11
12
func main(){
//设置过期时间为5秒
var timer = time.NewTimer(5 * time.Second)
go func(){
//TO DO
}()
select{
case <- timer.C:
//TO DO
fmt.Println("到点了")
}
}

定时到期后,还可使用Reset()方法再次启用,或者Stop()结束定时。

time.Ticker方法

一般用来作为时间周期执行任务,使用也很简单:

1
2
3
4
5
6
7
8
func main(){
ticker := time.NewTicker(5 * time.Second)
for{
<- ticker.C
//TO DO
fmt.Println("五秒执行一次")
}
}

与Timer对象不同的是,Ticker在时间到期后会自动续期,不用Reset()。