有时候在打印日志的时候,在频繁的操作中,会被日志刷屏,但又想定期打印查看状态。这个时候可以利用time.Timer实现一个可指定最小执行间隔的函数,具体看代码吧。
// Package tools ...
package tools
import (
"sync/atomic"
"time"
)
/*
NewTickDo 是一个很有意思的小工具,每隔n秒**尝试**执行一个操作,用在打日志非常方便,避免刷屏
使用方法:
tick = NewTickDo(time.Second)
for{
tick.Do(func() {
log.Infof("每秒执行一次,未到时间什么都不会发生,直接忽略")
})
}
*/
func NewTickDo(du time.Duration) *TickDo {
t := new(TickDo)
// 第一次让它过期
ttimer := time.NewTimer(time.Nanosecond)
time.Sleep(time.Nanosecond)
t.lastCall.Store(ttimer)
t.du = du
return t
}
// TickDo ...
type TickDo struct {
lastCall atomic.Value
du time.Duration
}
// Do 根据预定的时间,Do在调用时,会判定是否过了du时间,如果已过,则执行f(),否则忽略
//
// tick.Do(func(){
// fmt.Printf("hello\n")
// })
//
// 每隔一定的时间才会出现hello打印
func (t *TickDo) Do(f func()) {
select {
case <-t.lastCall.Load().(*time.Timer).C:
f()
t.lastCall.Store(time.NewTimer(t.du))
default:
}
}