去:股票与计时器
#编程 #go #bestofdev

介绍

go或golang是一种强大的语言,它提供了几个功能,以简化并发和网络程序的开发。这些功能之一是能够安排任务以特定时间或间隔运行。此功能由Golang中的两种计时器提供:time.Timertime.Ticker

这两个都对调度任务有用,但是它们具有不同的用例和行为。在本文中,我们将探讨两者之间的差异以及何时选择哪一个。

golang小时

time.Timer类型代表一个单一事件,将来只会发生一次。创建计时器时,它不会自动启动。相反,它等待指定的持续时间,然后发射一次。计时器启动后,它将无法再次使用。

让我们看一个示例,说明如何在2秒延迟后创建一个计时器:

package main

import (
    "fmt"
    "time"
)

func main() {
    timer := time.NewTimer(2 * time.Second)

    <-timer.C
    fmt.Println("Timer fired!")
}

游乐场网址:https://go.dev/play/p/FFC-f9IdygK

在此示例中,我们使用time.newtimer函数创建一个新的计时器,并将其传递2秒钟。然后,我们通过使用< - 运算符从其C通道读取其C频道来等待计时器。计时器发射后,我们将向控制台打印一条消息。

重要的是要注意,如果我们试图在计时器发射后重置计时器,我们会感到恐慌:

timer.Reset(time.Second) // panic: Reset called on a Timer that has already fired or been stopped

Golang Ticker

time.Ticker类型代表以固定间隔触发的重复事件。创建股票时,它会自动启动,并以指定的间隔发射直到停止。与时间。

让我们查看一个如何创建每500毫秒射击的股票的示例:

package main

import (
    "fmt"
    "time"
)

func main() {
    ticker := time.NewTicker(500 * time.Millisecond)

    go func() {
        for t := range ticker.C {
            fmt.Println("Tick at", t)
        }
    }()

    time.Sleep(2000 * time.Millisecond)
    ticker.Stop()
    fmt.Println("Ticker stopped")
}

游乐场网址:https://go.dev/play/p/b9GoglOKTHj

在此示例中,我们使用Time.newticker函数创建一个新的股票,并将其间隔为500毫秒。然后,我们创建了一个goroutine,该goroutine循环在股票的C频道上循环,每次发射股票时都会打印当前时间。我们在调用停止方法之前停止了股票的射击。

重要的是要注意,如果我们尝试重置停止的股票,我们会感到恐慌:

ticker.Stop()
ticker.Reset(1000 * time.Millisecond) // panic: Reset called on a stopped Ticker

用例

那么,我们什么时候应该使用计时器而不是股票机?这里有几个例子:

计时器

  • 当您需要在特定持续时间经过后一次执行任务时,计时器很有用。
  • 当您想确保将来在特定时间执行任务时,计时器也很有用。

股票

  • 当您需要以固定的间隔重复执行任务时,股票机很有用。
  • 当您想定期检查某物状态(例如连接到服务器的连接)时,股票也很有用。
  • 当您想以特定间隔更新缓存时,股票也很有用。

结论

总而言之,Time.Timer和Time.Golang中的Ticker类型为调度任务提供了强大的功能。计时器仅在一次活动中射击一次,而Tresker是为了连续开火。