123456789101112131415161718192021222324252627282930313233343536 |
- package executors
- import (
- "time"
- "github.com/tal-tech/go-zero/core/syncx"
- "github.com/tal-tech/go-zero/core/timex"
- )
- // A LessExecutor is an executor to limit execution once within given time interval.
- type LessExecutor struct {
- threshold time.Duration
- lastTime *syncx.AtomicDuration
- }
- // NewLessExecutor returns a LessExecutor with given threshold as time interval.
- func NewLessExecutor(threshold time.Duration) *LessExecutor {
- return &LessExecutor{
- threshold: threshold,
- lastTime: syncx.NewAtomicDuration(),
- }
- }
- // DoOrDiscard executes or discards the task depends on if
- // another task was executed within the time interval.
- func (le *LessExecutor) DoOrDiscard(execute func()) bool {
- now := timex.Now()
- lastTime := le.lastTime.Load()
- if lastTime == 0 || lastTime+le.threshold < now {
- le.lastTime.Set(now)
- execute()
- return true
- }
- return false
- }
|