Golang定时器使用
在Golang中使用定时器时遇到了几个问题想请教大家:
- time.NewTimer()和time.NewTicker()有什么区别?分别在什么场景下使用更合适?
- 定时器使用后需要手动停止吗?如果忘记停止会导致内存泄漏吗?
- 如何正确处理定时器触发的事件?需要注意哪些并发问题?
- 在服务优雅关闭时,如何安全地清理正在运行的定时器?
- 有没有性能更好的第三方定时器库推荐?标准库的定时器在高并发场景下表现如何?
2 回复
Golang中可使用time包实现定时器。常用方法:
- time.NewTimer(d):单次定时,需手动Stop()
- time.AfterFunc(d, f):延迟执行函数
- time.Tick(d):返回通道,定期触发
- time.After(d):单次延迟,返回通道
注意:需及时停止定时器防止内存泄漏,循环任务建议用Ticker。
更多关于Golang定时器使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,定时器用于在指定时间后执行任务,主要有两种类型:一次性定时器(time.Timer)和周期性定时器(time.Ticker)。
1. 一次性定时器(Timer)
- 用途:在指定时间后触发一次。
- 创建:使用
time.NewTimer(duration)。 - 停止:调用
timer.Stop()可取消定时器。 - 重置:通过
timer.Reset(duration)重新设置时间。
示例代码:
package main
import (
"fmt"
"time"
)
func main() {
timer := time.NewTimer(2 * time.Second) // 2秒后触发
<-timer.C // 阻塞等待触发
fmt.Println("Timer fired!")
}
2. 周期性定时器(Ticker)
- 用途:每隔固定时间重复触发。
- 创建:使用
time.NewTicker(duration)。 - 停止:调用
ticker.Stop()停止触发。
示例代码:
package main
import (
"fmt"
"time"
)
func main() {
ticker := time.NewTicker(1 * time.Second) // 每秒触发一次
defer ticker.Stop()
for {
select {
case <-ticker.C:
fmt.Println("Ticker ticked!")
}
}
}
注意事项:
- 使用
time.After(duration)可直接返回一个通道,在指定时间后接收信号(适用于单次延迟操作)。 - 定时器使用后需及时停止,避免资源泄漏。
- 在并发场景中,确保对定时器的操作(如重置或停止)是线程安全的。
以上方法简单高效,适用于大多数定时任务场景。

