go 中的定时器相关
2022-08-20 本文已影响0人
wayyyy
time.After
func main() {
tChannel := time.After(3 * time.Second)
select {
case <-tChannel:
fmt.Println("3s arrived")
}
}
![](https://img.haomeiwen.com/i7304940/728ccc58b66fbb39.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")
}
}
![](https://img.haomeiwen.com/i7304940/7b4be4d2fa63d7ac.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...")
}
}
![](https://img.haomeiwen.com/i7304940/c13d55dd39f0fa06.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("资源泄露")
}
}
}