支持管理定时器调度
This commit is contained in:
parent
ce63fff7c7
commit
2fd042eb47
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue