From 2fd042eb4746c0eb5c801af3e0be5c79143ca8bc Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 16 May 2023 12:06:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E7=AE=A1=E7=90=86=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E5=99=A8=E8=B0=83=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/timer/options.go | 10 ++++++++++ utils/timer/scheduler.go | 6 ------ utils/timer/ticker.go | 11 +++++++++-- utils/timer/timer.go | 8 ++++++-- 4 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 utils/timer/options.go diff --git a/utils/timer/options.go b/utils/timer/options.go new file mode 100644 index 0000000..9426869 --- /dev/null +++ b/utils/timer/options.go @@ -0,0 +1,10 @@ +package timer + +type Option func(ticker *Ticker) + +// WithCaller 通过其他的 handle 执行 Caller +func WithCaller(handle func(name string, caller func())) Option { + return func(ticker *Ticker) { + ticker.handle = handle + } +} diff --git a/utils/timer/scheduler.go b/utils/timer/scheduler.go index bdc6105..7b04032 100644 --- a/utils/timer/scheduler.go +++ b/utils/timer/scheduler.go @@ -47,12 +47,6 @@ func (slf *Scheduler) Next(prev time.Time) time.Time { return prev.Add(slf.interval) } -// 实际执行的任务 -func (slf *Scheduler) caller() { - // TODO: 直接调用可能会导致更高的并发复杂度 - slf.Caller() -} - // Caller 可由外部发起调用的执行函数 func (slf *Scheduler) Caller() { slf.lock.Lock() diff --git a/utils/timer/ticker.go b/utils/timer/ticker.go index 623aabf..463dedb 100644 --- a/utils/timer/ticker.go +++ b/utils/timer/ticker.go @@ -14,6 +14,7 @@ type Ticker struct { wheel *timingwheel.TimingWheel timers map[string]*Scheduler lock sync.RWMutex + handle func(name string, caller func()) } // Release 释放管理器,并将管理器重新放回 Timer 池中 @@ -27,7 +28,7 @@ func (slf *Ticker) Release() { scheduler.close() delete(slf.timers, name) } - + slf.handle = nil slf.lock.Unlock() slf.timer.tickers = append(slf.timer.tickers, slf) @@ -98,6 +99,12 @@ func (slf *Ticker) Loop(name string, after, interval time.Duration, times int, h slf.lock.Lock() slf.timers[name] = scheduler - scheduler.timer = slf.wheel.ScheduleFunc(scheduler, scheduler.caller) + if slf.handle != nil { + scheduler.timer = slf.wheel.ScheduleFunc(scheduler, func() { + slf.handle(scheduler.Name(), scheduler.Caller) + }) + } else { + scheduler.timer = slf.wheel.ScheduleFunc(scheduler, scheduler.Caller) + } slf.lock.Unlock() } diff --git a/utils/timer/timer.go b/utils/timer/timer.go index 6e85b37..fe2cb80 100644 --- a/utils/timer/timer.go +++ b/utils/timer/timer.go @@ -8,8 +8,12 @@ import ( var timer = new(Timer) -func GetTicker(size int) *Ticker { - return timer.NewTicker(size) +func GetTicker(size int, options ...Option) *Ticker { + ticker := timer.NewTicker(size) + for _, option := range options { + option(ticker) + } + return ticker } type Timer struct {