go:在调用函数时指定最小运行间隔

2024-01-10 09:50:50 浏览数 (2)

有时候在打印日志的时候,在频繁的操作中,会被日志刷屏,但又想定期打印查看状态。这个时候可以利用time.Timer实现一个可指定最小执行间隔的函数,具体看代码吧。

代码语言:javascript复制
// 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("hellon")
//	})
//
// 每隔一定的时间才会出现hello打印
func (t *TickDo) Do(f func()) {
    select {
    case <-t.lastCall.Load().(*time.Timer).C:
        f()
        t.lastCall.Store(time.NewTimer(t.du))
    default:
    }
}

0 人点赞