美文网首页golang
go 中的定时器相关

go 中的定时器相关

作者: wayyyy | 来源:发表于2022-08-20 01:30 被阅读0次
    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("资源泄露")
             }
        }
    }
    

    相关文章

      网友评论

        本文标题:go 中的定时器相关

        本文链接:https://www.haomeiwen.com/subject/hatcgrtx.html