文章目录
GO的定时器Timer 和定时任务cron
上次我们说到了GO 中 swaggo 的应用,咱们来回顾一下
- swaggo 是什么
- swagger 是什么
- 如何使用 swaggo
- 如何测试 swaggo
要是对GO 中 swaggo 的应用还有点兴趣的话,可以查看文章 工作中后端是如何将API提供出去的?swaggo很不错
之后我们可以来一次 swaggo
的原理分享,细细的了解一下swaggo
是如何生成swagger
文档的
今天咱们来看看 GO 里面的 **定时器 Timer 和 定时任务 cron **
咱们今天还是来看看 定时器 timer 和 定时任务 cron 如何使用,关于他们的原理,咱们后续文章会详细分享
Timer 是什么?
是 GO 中提供一个 定时器包,主要是用 time.Timer
timer 实际上是一种单一事件的定时器
也就是说,经过指定的时间后触发一个事件,这个事件通过其本身提供的 通道 进行通知 , 因为Timer只执行一次就结束,所以叫他单一事件
Timer
与Ticker
的最重要的区别之一 就是这里了
大致流程是这个样子的:
Go 运行时会启动一个单独的 协程
该协程 执行了一个 timerproc
的函数,维护了一个 最小堆
该协程会定期被唤醒并读取堆顶的 timer
对象,执行该 timer 对象对应的函数(就是在 timer.C
中发送一条数据,用于触发定时器)
执行完毕后就会从最小堆中移除该 timer
对象
咱们创建的 time.Timer
,实际上就是在这个最小堆中添加一个 timer
对象实例,那么我们需要停止定时器,也就是使用 timer.Stop
的时候,就是从这个堆里面删除对应的 timer
对象
本文先不细细说明实际原理,咱们先会简单应用它,后续会详细分享
万事开头难,然后中间难,最后结尾难
Timer 如何使用?
咱们简单看看 Timer
对应的数据结构
位置在: src/time/sleep.go:Timer
Timer
代表一次定时,时间到来后只发生一个事件
只发生一次,这里尤为重要
Timer
对外仅暴露一个通道,指定的时间到了,就会往该通道中写入系统时间,时间到了就触发一次事件,只会触发一次,因为时间只会到一次
type Timer struct {
C <-chan Time
r runtimeTimer
}
咱们分别从如下几个场景使用一下 Timer
- 基本使用
- Time 延时使用
- 停止定时器
- 重置定时器
基本使用
咱们设置一个 1s 中的定时器,这个定时器只会触发一次
创建一个定时器:
func New*Timer*(d Duration) Timer
指定一个时间即可创建一个Timer
,Timer
一经创建便开始计时,不需要额外的启动命令
func main() {
// 创建一个 Timer
myT := time.NewTimer(1 * time.Second)
// 从通道中读取数据,若读取得到,说明时间到了
<- myT.C
fmt.Println(" 1 s 时间到")
for {
}
}
Time 延时使用
设置一个 1 秒的定时,再延时 2 秒
func main() {
// 创建一个 Timer
myT := time.NewTimer(1 * time.Second)
<- myT.C
fmt.Println(" 1 s 时间到 ",time.Now().Unix())
// 延时 2 秒
<-time