两种类型的定时器: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…