go 定时器

有问题用法

package main

import (
    "encoding/json"
    "fmt"
    "sync/atomic"
    "time"
)

func demo() {
    for {
        select {
        case <-time.After(time.Second * 1):
            println("1s timer")

        case <-time.After(time.Second * 2):
            println("2s timer")
        }
    }
}

func main() {

    go demo()
    select {}
}

这里写图片描述

看到2s的定时器一直没有执行,原因就是 select 每次执行都会重新执行 case 条件语句,并重新注册到 select ,每次都会新构造一个 Timer 对象,所以2秒的定时器永远不会执行。而且会造成内存的泄露。这样的设计倒是也有好处,定时器可用于另一个chan的超时处理

正确用法

code

func demo(t1 interface{}, t2 interface{}) {
    for {
        select {
        case <-t1.(*time.Ticker).C:
            println("1s timer")

        case <-t2.(*time.Ticker).C:
            println("2s timer")
        }
    }
}

func main() {

    t1 := time.NewTicker(time.Second * 1)
    t2 := time.NewTicker(time.Second * 2)
    go demo(t1, t2)
    select {}
}

这里写图片描述

可以看到两个定时器都可以正常运行

引用

https://blog.csdn.net/x356982611/article/details/80425030
https://blog.csdn.net/wl2002200/article/details/54565211
https://godoc.org/time#After

猜你喜欢

转载自blog.csdn.net/x356982611/article/details/80425030