go 定时器 ticker和timer

原文链接

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

ticker

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

实操如下

1
2
3
4
5
6
7
8
9
10
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…

-------------本文结束 感谢阅读-------------