go 语言中的 Timers Tickers 的使用
文章目录
go语言中的 Timers 和 Tickers
go语言中对某段业务逻辑在未来某一时刻执行或以一定时间间隔周期性执行的需求提供了支持;
timer 可以在未来某一时间发生;
ticker 可以指定时间间隔周期发生.
Timers的使用
Timer表示在未来某一刻执行仅一次的事件
一旦时间到达预设时期,触发程序执行并且 timer 会调用 Stop() 函数停止再次运行.
/*
* @Author: your name
* @Date: 2021-01-14 16:29:13
* @LastEditTime: 2021-01-14 17:03:54
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: /program/time.go
*/
package main
import (
"fmt"
"time"
)
func main() {
timer1 := time.NewTimer(time.Second)
//goroutine 阻塞,直到时间达到预设值
<-timer1.C
fmt.Println("timer1 START")
timer1 = time.NewTimer(2 * time.Second)
go func() {
<-timer1.C
fmt.Println("timer1 START again")
}()
if timer1.Stop() {
fmt.Println("timer stoped")
}
}
time1 预设1秒钟后执行:
<-timer1.C 会一直阻塞,知道预定时间到达,开始执行代码,打印 "timer1 START"
timer变量一旦触发一次后,便会执行 timer1.Stop()
所以上面 goroutine 中的函数并没有触发,因为已经 stop
代码运行结果:
# zhangzhi @ ZhangZhi-MacBook-Pro in ~/code/go/program [17:04:10]
$ go run time.go
timer1 START
timer stoped
time.AfterFunc 也可以预设时间启动执行
无论是以time.NewTimer方式,
还是以time.AfterFunc方式 预设一个未来时间,
当时间到达便触发函数
package main
import (
"fmt"
"time"
)
func main() {
done := make(chan bool)
time.AfterFunc(time.Second, func() {
fmt.Println("time start")
done <- true
})
<-done
}
上面代码创建了通道 done ;
当触发到达时间时,执行AfterFunc 中的回调函数;
打印 "time start";
把 true 传值给 done;
main 函数中的 匿名通道发送数据 <- done ,没有接收数据的地方(顾称作匿名发送通道)
因为时间触发函数中有数据传入 通道 done;
所以必须有 通道发送数据,否则程序会阻塞.
go语言针对 time 定时触发其实内部创建了一个监听goroutine ,使用堆来统一管理 timer ,
新建 timer 便插入堆中,达到触发时间后,便从堆中移除.
Tickers 的使用
Ticker表示一个按一定时间间隔周期性执行的事件;
我们尝试每一秒打印时钟的时间,5秒后停止;
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(time.Second)
go func() {
for t := range ticker.C {
fmt.Println(t)
}
}()
time.Sleep(5 * time.Second)
ticker.Stop()
}
运行结果:
# zhangzhi @ ZhangZhi-MacBook-Pro in ~/code/go/program [17:15:53]
$ go run ticker.go
2018-12-23 20:16:22.086294 +0800 CST m=+1.004548545
2018-12-23 20:16:23.086654 +0800 CST m=+2.004887155
2018-12-23 20:16:24.086177 +0800 CST m=+3.004387470
2018-12-23 20:16:25.086364 +0800 CST m=+4.004552241
2018-12-23 20:16:26.086905 +0800 CST m=+5.005069556