支持管理定时器调度

This commit is contained in:
kercylan98 2023-05-16 12:06:12 +08:00
parent ce63fff7c7
commit 2fd042eb47
4 changed files with 25 additions and 10 deletions

10
utils/timer/options.go Normal file
View File

@ -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
}
}

View File

@ -47,12 +47,6 @@ func (slf *Scheduler) Next(prev time.Time) time.Time {
return prev.Add(slf.interval) return prev.Add(slf.interval)
} }
// 实际执行的任务
func (slf *Scheduler) caller() {
// TODO: 直接调用可能会导致更高的并发复杂度
slf.Caller()
}
// Caller 可由外部发起调用的执行函数 // Caller 可由外部发起调用的执行函数
func (slf *Scheduler) Caller() { func (slf *Scheduler) Caller() {
slf.lock.Lock() slf.lock.Lock()

View File

@ -14,6 +14,7 @@ type Ticker struct {
wheel *timingwheel.TimingWheel wheel *timingwheel.TimingWheel
timers map[string]*Scheduler timers map[string]*Scheduler
lock sync.RWMutex lock sync.RWMutex
handle func(name string, caller func())
} }
// Release 释放管理器,并将管理器重新放回 Timer 池中 // Release 释放管理器,并将管理器重新放回 Timer 池中
@ -27,7 +28,7 @@ func (slf *Ticker) Release() {
scheduler.close() scheduler.close()
delete(slf.timers, name) delete(slf.timers, name)
} }
slf.handle = nil
slf.lock.Unlock() slf.lock.Unlock()
slf.timer.tickers = append(slf.timer.tickers, slf) 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.lock.Lock()
slf.timers[name] = scheduler 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() slf.lock.Unlock()
} }

View File

@ -8,8 +8,12 @@ import (
var timer = new(Timer) var timer = new(Timer)
func GetTicker(size int) *Ticker { func GetTicker(size int, options ...Option) *Ticker {
return timer.NewTicker(size) ticker := timer.NewTicker(size)
for _, option := range options {
option(ticker)
}
return ticker
} }
type Timer struct { type Timer struct {