Golang定时器使用

在Golang中使用定时器时遇到了几个问题想请教大家:

  1. time.NewTimer()和time.NewTicker()有什么区别?分别在什么场景下使用更合适?
  2. 定时器使用后需要手动停止吗?如果忘记停止会导致内存泄漏吗?
  3. 如何正确处理定时器触发的事件?需要注意哪些并发问题?
  4. 在服务优雅关闭时,如何安全地清理正在运行的定时器?
  5. 有没有性能更好的第三方定时器库推荐?标准库的定时器在高并发场景下表现如何?
2 回复

Golang中可使用time包实现定时器。常用方法:

  1. time.NewTimer(d):单次定时,需手动Stop()
  2. time.AfterFunc(d, f):延迟执行函数
  3. time.Tick(d):返回通道,定期触发
  4. 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) 可直接返回一个通道,在指定时间后接收信号(适用于单次延迟操作)。
  • 定时器使用后需及时停止,避免资源泄漏。
  • 在并发场景中,确保对定时器的操作(如重置或停止)是线程安全的。

以上方法简单高效,适用于大多数定时任务场景。

回到顶部