Golang 如何执行定时器 Timer

前言

Golang 定时器允许我们在将来的某个时间点执行一次或定期执行代码,这在编写需要调度任务或者实现某些定时操作的程序时非常有用。Golang 的标准库 time 提供了强大的定时器和计时器功能。

本文将详细介绍如何在 Golang 中使用定时器。

实现方式

一、单次定时器

如果只想在将来的某个时间点执行一次任务,可以使用 time.AfterFunc 函数或者 time.NewTimer 方法。

使用 time.AfterFunc

go
package main import ( "fmt" "time" ) func main() { // 定义一个延迟时间,比如2秒 duration := 2 * time.Second // 创建一个定时器,在2秒后执行 timer := time.AfterFunc(duration, func() { fmt.Println("Timer expired") }) // 等待定时器触发或者其他逻辑 // ... 可以在这里执行其他任务 // 如果需要,可以停止定时器 // timer.Stop() // 防止程序直接退出,等待定时任务执行完毕 time.Sleep(3 * time.Second) }

在上面的代码中,time.AfterFunc 将在指定的延迟后调用传入的函数。

使用 time.NewTimer

go
package main import ( "fmt" "time" ) func main() { // 定义一个延迟时间 duration := 2 * time.Second // 创建一个新定时器 timer := time.NewTimer(duration) // 当定时器到期时,时间将被发送到 timer.C <-timer.C fmt.Println("Timer expired") // 如果需要,可以重设定时器 // timer.Reset(duration) // 如果需要,可以停止定时器 // timer.Stop() }

在这个例子中,time.NewTimer 创建了一个新的定时器实例。当定时器到期时,当前时间会被发送到通道 timer.C

二、周期定时器

如果你想要定期执行任务,可以使用 time.Ticker

使用 time.NewTicker

go
package main import ( "fmt" "time" ) func main() { // 定义周期时间,比如每隔1秒 interval := 1 * time.Second // 创建一个周期定时器 ticker := time.NewTicker(interval) defer ticker.Stop() // 使用for循环来处理定时事件 for { select { case <-ticker.C: // 定时器到时,执行的操作 fmt.Println("Ticker ticked") // 可以添加其他case处理其他事项 // case <-someOtherChannel: // // 处理其他事件 } } }

在上面的代码中,使用 time.NewTicker 创建了一个周期定时器,每隔指定的时间 interval 就会执行一次循环体中的代码。

总结

通过标准库中的 time 包,可以方便地创建单次定时器和周期定时器来调度任务的执行。只需要选择合适的工具,无论是一次性执行还是周期性执行任务,Go 都能够帮助你优雅地实现。

Golang 的定时器和计时器是并发安全的,可以在多个goroutine之间共享使用,这在编写并发程序时尤其有用。通过上面的例子,应该对如何在 Go 程序中创建和管理定时器有了一个基本的理解。