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