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  }