golang 定时器 ticker和timer

以下内容转载自 https://blog.csdn.net/lanyang123456/article/details/79794183

两种类型的定时器:ticker和timer。两者有什么区别呢?请看如下代码:

ticker

package main

import (
        "fmt"
        "time"
)

func main() {
        d := time.Duration(time.Second*2)
        t := time.NewTicker(d)
        defer t.Stop()

        for {
                <- t.C
                fmt.Println("timeout...")
        }
}

 

timeout…

timeout…

timeout…

解析

ticker只要定义完成,从此刻开始计时,不需要任何其他的操作,每隔固定时间都会触发。

 

timer


package main

import (
        "fmt"
        "time"
)


func main() {

        d := time.Duration(time.Second*2)
        t := time.NewTimer(d)
        defer t.Stop()

        for {
            <- t.C
            fmt.Println("timeout...")
		    // need reset
		    t.Reset(time.Second*2)
        }
}

output:

timeout…

timeout…

timeout…

解析

使用timer定时器,超时后需要重置,才能继续触发。

 

如果callback中有sleep操作,那么ticker也不会在sleep期间发送多个timeout_signal,可以认为用了一个容量为1的channel

实操如下

d := time.Duration(time.Second * 1)
t := time.NewTicker(d)
defer t.Stop()
log.Println("timeout...")
time.Sleep(10 * time.Second)

for {
	<-t.C
	log.Println("timeout...")
}
15:12:44 timeout...
15:12:54 timeout...
15:12:55 timeout...

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值