返回

用 Go 的 Timer 和 Ticker 计时器进行精确计时

后端

Go 定时器:Timer 和 Ticker

Go 语言为我们提供了两种常用的定时器:time.Timertime.Ticker。这两种定时器都可以用于周期性地执行任务,但它们在使用场景和具体特性上存在着一定的差异。接下来,我们将详细介绍这两种定时器,并比较它们的异同。

time.Timer 用于创建一次性的定时器,它可以让我们在指定的时间后执行某个任务。time.Timer 通过调用 time.NewTimer(duration) 方法来创建,其中 duration 参数指定了定时器的时间间隔。

time.Timer 提供了以下方法:

  • Reset(d Duration):重置定时器的持续时间,并重新启动它。
  • Stop():停止定时器。

当定时器到期时,它将向关联的通道发送一个信号,表示定时器已经完成。我们可以通过调用 time.Timer.C 方法来获取这个通道。

下面是一个使用 time.Timer 的示例:

package main

import (
	"fmt"
	"time"
)

func main() {
	// 创建一个定时器,在 5 秒后触发。
	timer := time.NewTimer(5 * time.Second)

	// 阻塞等待定时器触发。
	<-timer.C

	// 定时器触发后,执行以下任务。
	fmt.Println("定时器已触发!")
}

输出:

定时器已触发!

time.Ticker 用于创建周期性的定时器,它可以让我们在指定的时间间隔内重复执行某个任务。time.Ticker 通过调用 time.NewTicker(duration) 方法来创建,其中 duration 参数指定了定时器的时间间隔。

time.Ticker 提供了以下方法:

  • Reset(d Duration):重置定时器的持续时间,并重新启动它。
  • Stop():停止定时器。

当定时器到期时,它将向关联的通道发送一个信号,表示定时器已经完成。我们可以通过调用 time.Ticker.C 方法来获取这个通道。

下面是一个使用 time.Ticker 的示例:

package main

import (
	"fmt"
	"time"
)

func main() {
	// 创建一个定时器,每 2 秒触发一次。
	ticker := time.NewTicker(2 * time.Second)

	// 启动一个 goroutine 来处理定时器触发的事件。
	go func() {
		for range ticker.C {
			// 定时器触发后,执行以下任务。
			fmt.Println("定时器已触发!")
		}
	}()

	// 等待 10 秒后停止定时器。
	time.Sleep(10 * time.Second)
	ticker.Stop()
}

输出:

定时器已触发!
定时器已触发!
定时器已触发!
定时器已触发!
定时器已触发!
  • time.Timer 用于创建一次性的定时器,而 time.Ticker 用于创建周期性的定时器。
  • time.Timer 通过调用 time.NewTimer(duration) 方法来创建,而 time.Ticker 通过调用 time.NewTicker(duration) 方法来创建。
  • time.Timer 提供了 Reset(d Duration)Stop() 两个方法,而 time.Ticker 也提供了这两个方法,另外还提供了 Tick() 方法,用于返回通道。
  • time.Timer 当定时器到期时,它将向关联的通道发送一个信号,表示定时器已经完成,而 time.Ticker 当定时器到期时,它将向关联的通道发送一个信号,表示定时器已经完成,并且会继续循环执行。

time.Timertime.Ticker 都是 Go 语言中常用的定时器,它们可以让我们在指定的时间后或周期性地执行某个任务。根据不同的使用场景,我们可以选择合适的定时器来完成任务。

我希望这篇文章对您有所帮助。如果您有任何疑问或建议,请随时给我留言。