golang

go 中的定时器相关

2022-08-20  本文已影响0人  wayyyy
time.After
func main() {
    tChannel := time.After(3 * time.Second)
    select {
    case <-tChannel:
        fmt.Println("3s arrived")
    }
}
image.png

或者可以直接使用 time.AfterFunc 设置回调函数

func main() {
    time.AfterFunc(3 * time.Second, func(){
        fmt.Println("3s arrived")
    })

    time.Sleep(5 * time.Second) //等待协程退出
}
time.Timer
func NewTimer(d Duration) *Timer

func (t *Timer) Stop() bool
    Timer 创建后可随时停止,true : 定时器未超时,后续不会再有事件发送;false : 定时器超时后停止

func (t *Timer) Reset(d Duration) bool
    已经过期的定时器或已经停止的定时器,可以通过重置来重新激活,重置的动作实质上是先停掉定时器,再启动。其返回值也即停掉计时器的返回值。
func main() {
    timer := time.NewTimer(5 * time.Second)

    select {
    case <- timer.C:
        fmt.Println("3s arrived")
    }
}
image.png
time.Ticker
func NewTicker(d Durtion) *Ticker
func (t *Ticker) Stop()

time.Ticker以周期性地触发时间事件,每次到达指定的时间间隔后都会触发事件。

func main() {
    ticker := time.NewTicker(1 * time.Second)
    defer ticker.Stop() // 需要关闭

    for range ticker.C {
        fmt.Println(time.Now().Unix(), "ticker...")
    }
}
image.png
time.Tick
func Tick(d Durtion) <-chan Time

这个函数内部实际还是创建一个 Ticker,但是它并不会返回出来,所以没有手段来停止该 Ticker;同时 time.Tick 创建的 Ticker 在运行时不会被 gc 回收,能不用就不用。下面的错误示例:

func WorngTicker() {
    for {
        select {
        case <- time.Tick(1 * time.Second)    // 每次都会创建。
            fmt.Println("资源泄露")
         }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读