2.1 Timer 相关
func NewTimer(d Duration) *Timer
func (t *Timer) Reset(d Duration) bool
func (t *Timer) Stop() bool
func After(d Duration) <-chan Time
func AfterFunc(d Duration, f func()) *Timer
//timer例子
func main() {
timer := time.NewTimer(3 * time.Second) //启动定时器,生产一个Timer对象
select {
case <-timer.C:
fmt.Println("3秒执行任务")
}
timer.Stop() // 不再使用了,结束它
}
//time.After例子
func main() {
tChannel := time.After(3 * time.Second) // 其内部其实是生成了一个Timer对象
select {
case <-tChannel:
fmt.Println("3秒执行任务")
}
}
func main() {
timer := time.NewTimer(3 * time.Second)
for {
timer.Reset(4 * time.Second) // 这样来复用 timer 和修改执行时间
select {
case <-timer.C:
fmt.Println("每隔4秒执行任务")
}
}
}
从上面可以看出来 Timer 允许再次被启用,而 time.After 返回的是一个 channel,将不可复用。
而且需要注意的是 time.After 本质上是创建了一个新的 Timer 结构体,只不过暴露出去的是结构体里的 channel 字段而已。
for{...}
错误使用:
for 里的 time.After 将会不断的创建 Timer 对象,虽然最终会回收,但是会造成无意义的cpu资源消耗
func main() {
for {
select {
case <-time.After(3 * time.Second):
fmt.Println("每隔3秒执行一次")
}
}
}
正确使用:
func main() {
timer := time.NewTimer(3 * time.Second)
for {
timer.Reset(3 * time.Second) // 这里复用了 timer
select {
case <-timer.C:
fmt.Println("每隔3秒执行一次")
}
}
}
2.2 Ticker 相关
这里的 Ticker 跟 Timer 的不同之处,就在于 Ticker 时间达到后不需要人为调用 Reset 方法,会自动续期。
func NewTicker(d Duration) *Ticker
func Tick(d Duration) <-chan Time
func (t *Ticker) Stop()
func main() {
ticker := time.NewTicker(3 * time.Second)
for range ticker.C {
fmt.Print("每隔3秒执行任务")
}
ticker.Stop()
}
错误使用:
func main() {
for {
select {
case <-time.Tick(3 * time.Second): // 这里会不断生成 ticker,而且 ticker 会进行重新调度,造成泄漏
fmt.Println("每隔3秒执行一次")
}
}
}
3、定时器使用示例
3.1 Ticker定时器
package main
import (
"fmt"
"time"
)
func main() {
// Ticker 包含一个通道字段C,每隔时间段 d 就向该通道发送当时系统时间。
// 它会调整时间间隔或者丢弃 tick 信息以适应反应慢的接收者。
// 如果d <= 0会触发panic。关闭该 Ticker 可以释放相关资源。
ticker1 := time.NewTicker(5 * time.Second)
// 一定要调用Stop(),回收资源
defer ticker1.Stop()
go func(t *time.Ticker) {
for {
// 每5秒中从chan t.C 中读取一次
<-t.C
fmt.Println("Ticker:", time.Now().Format("2006-01-02 15:04:05"))
}
}(ticker1)
time.Sleep(30 * time.Second)
fmt.Println("ok")
}
执行结果:
Ticker: 2022-01-18 13:39:30 Ticker: 2022-01-18 13:39:35 Ticker: 2022-01-18 13:39:40 Ticker: 2022-01-18 13:39:45 Ticker: 2022-01-18 13:39:50 ok Ticker: 2022-01-18 13:39:55
可以看到每次执行的时间间隔都是一样的,由于main线程结束导致程序结束。
3.2 Timer定时器
执行结果:
time.Reset()2秒time.Stop()
4、总结
time.Reset()Stop()Reset()Stop()stopTimer().Cchan Time