Go语言定时器Timer和Ticker的使用与区别
作者:CodeJR
概述
在日常开发中,我们不可避免的需要使用到定时任务用来处理业务逻辑。在Go语言中内置的有两个定时器,Timer和Ticker,合理的使用这两个定时器可以很好的解决定时任务的需求,同时除了这两个内置的定时器外,还有另外的三方库也可以用来完成定时任务的需求。
Timer
简介
Timer定时器可以在指定时间后执行一次,使用time包中的NewTimer方法传入间隔时间参数即可创建一个Timer定时器,定时器将会在指定的时间后执行一次。
Timer中共有以下方法可调用
// 创建 func NewTimer(d Duration) *Timer // 重置 func (t *Timer) Reset(d Duration) bool // 停止 func (t *Timer) Stop() bool
在Timer中除了有以上方法之外,还有最重要的就是Timer中包含一个时间类型的通道C,当指定时间间隔到达后,就会将当前时间发送到通道C中,这样我们可以使用select监听通道C即可完成在指定时间后执行任务的需求。
基础用法
我们根据上面的描述,完成了下面的代码:
func main() { // 创建一个Timer定时器 timer := time.NewTimer(time.Second * 2) // 延迟关闭定时器 defer timer.Stop() fmt.Println("当前时间:", time.Now()) select { // 使用select监听通道C case nowTime := <-timer.C: fmt.Println("间隔2秒后指定定时任务,当前时间:", nowTime) } }
在idea中运行代码后会输出以下内容:
当前时间: 2024-06-30 15:12:08.7736065 +0800 CST m=+0.002108801
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:12:10.7797079 +0800 CST m=+2.008210201Process finished with the exit code 0
可以看到,Timer定时器在指定时间后会执行一次任务,然后结束。
Reset使用
在上面的代码中可以看到Timer在指定时间后仅能执行一次任务,但是我们可以使用Reset方法重置定时器,这样的话可以在每次执行任务后重置,用来达到每间隔指定时间都执行一次任务的需求。
将代码略做修改如下:
func main() { // 创建一个Timer定时器 timer := time.NewTimer(time.Second * 2) // 延迟关闭定时器 defer timer.Stop() fmt.Println("当前时间:", time.Now()) for { timer.Reset(time.Second * 2) select { // 使用select监听通道C case nowTime := <-timer.C: fmt.Println("间隔2秒后指定定时任务,当前时间:", nowTime) } } }
在上面代码中可以看到在每次的循环中都重置一次Timer定时器,这样的话就可以实现每隔一段时间都执行一次任务的需求。
最终运行结果如下:
当前时间: 2024-06-30 15:16:01.2907834 +0800 CST m=+0.002052801
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:03.3096846 +0800 CST m=+2.020954001
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:05.3236498 +0800 CST m=+4.034919201
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:07.3318153 +0800 CST m=+6.043084701
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:09.3462966 +0800 CST m=+8.057566001
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:16:11.3504773 +0800 CST m=+10.061746701
……
Ticker
简介
Ticker定时器的用法和Timer定时器的用法以及内置的方法都一样,区别在于Ticker不仅仅只执行一次,而是会根据指定的时间间隔不停地执行。
基础用法
代码如下:
func main() { ticker := time.NewTicker(time.Second * 2) defer ticker.Stop() fmt.Println("当前时间:", time.Now()) for { select { case nowTime := <-ticker.C: fmt.Println("间隔2秒后指定定时任务,当前时间:", nowTime) } } }
根据Ticker写出以上代码,代码会每隔2秒执行一次,不需要像Timer中那样每次使用Reset方法来重置定时器,最终运行结果如下:
当前时间: 2024-06-30 15:20:27.4070592 +0800 CST m=+0.002137901
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:29.4083801 +0800 CST m=+2.003458801
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:31.414517 +0800 CST m=+4.009595701
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:33.4191099 +0800 CST m=+6.014188601
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:35.4099723 +0800 CST m=+8.005051001
间隔2秒后指定定时任务,当前时间: 2024-06-30 15:20:37.4208446 +0800 CST m=+10.015923301
……
在Ticker定时器中同样也有Reset方法,但是就算不调用Reset方法定时器也会一直执行,所以这里的Reset方法可以用来重置定时器的间隔时间。
区别
- Ticker定时器表示每隔一段时间就执行一次,一般可执行多次。
- Timer定时器表示在一段时间后执行,默认情况下只执行一次,如果想再次执行的话,每次都需要调用Reset方法,此时效果类似Ticker定时器。同时也可以调用Stop方法取消定时器。
到此这篇关于Go语言定时器Timer和Ticker的使用与区别的文章就介绍到这了,更多相关Go语言定时器Timer和Ticker内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!