定时器1-"*/5 * * * * *"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package main import ( "fmt" "github.com/robfig/cron" ) //主函数 func main() { cron2 := cron.New() //创建一个cron实例 //执行定时任务(每5秒执行一次) err:= cron2.AddFunc( "*/5 * * * * *" , print5) if err!=nil{ fmt.Println(err) } //启动/关闭 cron2.Start() defer cron2.Stop() select { //查询语句,保持程序运行,在这里等同于for{} } } //执行函数 func print5() { fmt.Println( "每5s执行一次cron" ) } |
设置说明
1
2
3
4
5
6
7
8
9
10
|
┌─────────────second 范围 (0 - 60) │ ┌───────────── min (0 - 59) │ │ ┌────────────── hour (0 - 23) │ │ │ ┌─────────────── day of month (1 - 31) │ │ │ │ ┌──────────────── month (1 - 12) │ │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to │ │ │ │ │ │ Saturday) │ │ │ │ │ │ │ │ │ │ │ │ * * * * * * |
星号(*) :表示 cron 表达式能匹配该字段的所有值。如在第5个字段使用星号(month),表示每个月
斜线(/):表示增长间隔,如第2个字段(minutes) 值是 3-59/15,表示每小时的第3分钟开始执行一次,之后 每隔 15 分钟执行一次(即 3(3+0*15)、18(3+1*15)、33(3+2*15)、48(3+3*15) 这些时间点执行),这里也可以表示为:3/15
逗号(,):用于枚举值,如第6个字段值是 MON,WED,FRI,表示 星期一、三、五 执行
连字号(-):表示一个范围,如第3个字段的值为 9-17 表示 9am 到 5pm 直接每个小时(包括9和17)
问号(?):只用于 日(Day of month) 和 星期(Day of week),表示不指定值,可以用于代替 *
定时器2-Timer-Ticker
1
2
|
Timer //时间到了产生一次事件 Ticker //时间到了循环产生事件 |
Timer-只执行一次
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package main import ( "fmt" "time" ) func main() { //创建一个定时器,设置时间为2s,2s后,往time通道写内容(当前时间) timer := time.NewTimer( 2 * time.Second) fmt.Println( "当前时间:" , time.Now()) //2s后,往timer.C写数据,有数据后,就可以读取 t := <-timer.C //channel没有数据前后阻塞 fmt.Println( "t = " , t) } |
Ticker-循环执行
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package main import ( "fmt" "time" ) //验证time.NewTimer(),时间到了,只会响应一次 func main() { timer := time.NewTicker( 1 * time.Second) for { <-timer.C fmt.Println( "时间到" ) } } |
结果:
时间到
时间到
时间到
时间到
Timer延时功能
1
2
3
4
5
6
7
8
9
10
11
|
time.NewTimer( 2 * time.Second) //相当于time.Sleep(2 * time.Second) func main() { //延时2s后打印一句话 timer := time.NewTimer( 2 * time.Second) <-timer.C fmt.Println( "时间到" ) } func main() { <-time.After( 2 * time.Second) //定时2s,阻塞2s, 2s后产生一个事件,往channel写内容 fmt.Println( "时间到" ) } |
停止和重置定时器
1
2
|
ok := timer.Reset( 1 * time.Second) //重新设置为1s timer.Stop() //停止定时器 |
停止:
1
2
3
4
5
6
7
8
9
10
|
func main() { timer := time.NewTimer( 3 * time.Second) go func() { <-timer.C fmt.Println( "子协程可以打印了,因为定时器的时间到" ) }() timer.Stop() //停止定时器 for { } } |
重置:
1
2
3
4
5
6
7
|
func main() { timer := time.NewTimer( 3 * time.Second) ok := timer.Reset( 1 * time.Second) //重新设置为1s fmt.Println( "ok = " , ok) <-timer.C fmt.Println( "时间到" ) } |
定时器Ticker使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker( 1 * time.Second) i := 0 for { <-ticker.C i++ fmt.Println( "i = " , i) if i == 5 { ticker.Stop() break } } } |
以上就是go语言定时器的功能使用示例详解的详细内容,更多关于go语言定时器的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/guyouyin123/p/15772355.html