github.com/lingyao2333/mo-zero@v1.4.1/core/executors/delayexecutor.go (about) 1 package executors 2 3 import ( 4 "sync" 5 "time" 6 7 "github.com/lingyao2333/mo-zero/core/threading" 8 ) 9 10 // A DelayExecutor delays a tasks on given delay interval. 11 type DelayExecutor struct { 12 fn func() 13 delay time.Duration 14 triggered bool 15 lock sync.Mutex 16 } 17 18 // NewDelayExecutor returns a DelayExecutor with given fn and delay. 19 func NewDelayExecutor(fn func(), delay time.Duration) *DelayExecutor { 20 return &DelayExecutor{ 21 fn: fn, 22 delay: delay, 23 } 24 } 25 26 // Trigger triggers the task to be executed after given delay, safe to trigger more than once. 27 func (de *DelayExecutor) Trigger() { 28 de.lock.Lock() 29 defer de.lock.Unlock() 30 31 if de.triggered { 32 return 33 } 34 35 de.triggered = true 36 threading.GoSafe(func() { 37 timer := time.NewTimer(de.delay) 38 defer timer.Stop() 39 <-timer.C 40 41 // set triggered to false before calling fn to ensure no triggers are missed. 42 de.lock.Lock() 43 de.triggered = false 44 de.lock.Unlock() 45 de.fn() 46 }) 47 }