From ba0b9f7508c59e6b1bf97bb21eacadd3673aab4b Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Thu, 20 Apr 2023 16:38:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E5=99=A8=E7=BB=93=E6=9E=84?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/timer/constants.go | 11 ++++++++--- utils/timer/scheduler.go | 4 ++-- utils/timer/{manager.go => ticker.go} | 23 +++++++++++------------ utils/timer/timer.go | 26 +++++++++++++------------- 4 files changed, 34 insertions(+), 30 deletions(-) rename utils/timer/{manager.go => ticker.go} (74%) diff --git a/utils/timer/constants.go b/utils/timer/constants.go index 3cf682a..3ef5a3d 100644 --- a/utils/timer/constants.go +++ b/utils/timer/constants.go @@ -2,7 +2,12 @@ package timer import "time" -var ( - // 时间轮一刻度长度 - timingWheelTick = time.Millisecond * 10 +const ( + timingWheelTick = time.Millisecond * 10 // 时间轮一刻度长度 +) + +const ( + Forever = -1 // 无限循环 + Once = 1 // 一次 + Instantly = 0 // 立刻 ) diff --git a/utils/timer/scheduler.go b/utils/timer/scheduler.go index 3659384..bdc6105 100644 --- a/utils/timer/scheduler.go +++ b/utils/timer/scheduler.go @@ -23,7 +23,7 @@ type Scheduler struct { timer *timingwheel.Timer - manager *Manager + ticker *Ticker lock sync.RWMutex } @@ -65,7 +65,7 @@ func (slf *Scheduler) Caller() { slf.trigger++ if slf.total > 0 && slf.trigger >= slf.total { slf.lock.Unlock() - slf.manager.StopTimer(slf.name) + slf.ticker.StopTimer(slf.name) } else { slf.lock.Unlock() } diff --git a/utils/timer/manager.go b/utils/timer/ticker.go similarity index 74% rename from utils/timer/manager.go rename to utils/timer/ticker.go index 6fe01e4..623aabf 100644 --- a/utils/timer/manager.go +++ b/utils/timer/ticker.go @@ -8,8 +8,8 @@ import ( "github.com/RussellLuo/timingwheel" ) -// Manager 管理器 -type Manager struct { +// Ticker 管理器 +type Ticker struct { timer *Timer wheel *timingwheel.TimingWheel timers map[string]*Scheduler @@ -17,7 +17,7 @@ type Manager struct { } // Release 释放管理器,并将管理器重新放回 Timer 池中 -func (slf *Manager) Release() { +func (slf *Ticker) Release() { slf.timer.lock.Lock() defer slf.timer.lock.Unlock() @@ -30,11 +30,11 @@ func (slf *Manager) Release() { slf.lock.Unlock() - slf.timer.Managers = append(slf.timer.Managers, slf) + slf.timer.tickers = append(slf.timer.tickers, slf) } // StopTimer 停止特定名称的调度器 -func (slf *Manager) StopTimer(name string) { +func (slf *Ticker) StopTimer(name string) { slf.lock.Lock() defer slf.lock.Unlock() @@ -45,7 +45,7 @@ func (slf *Manager) StopTimer(name string) { } // IsStopped 特定名称的调度器是否已停止 -func (slf *Manager) IsStopped(name string) bool { +func (slf *Ticker) IsStopped(name string) bool { slf.lock.RLock() defer slf.lock.RUnlock() if s, ok := slf.timers[name]; ok { @@ -55,7 +55,7 @@ func (slf *Manager) IsStopped(name string) bool { } // GetSchedulers 获取所有调度器名称 -func (slf *Manager) GetSchedulers() []string { +func (slf *Ticker) GetSchedulers() []string { slf.lock.RLock() defer slf.lock.RUnlock() names := make([]string, 0, len(slf.timers)) @@ -66,12 +66,12 @@ func (slf *Manager) GetSchedulers() []string { } // After 设置一个在特定时间后运行一次的调度器 -func (slf *Manager) After(name string, after time.Duration, handleFunc interface{}, args ...interface{}) { +func (slf *Ticker) After(name string, after time.Duration, handleFunc interface{}, args ...interface{}) { slf.Loop(name, after, timingWheelTick, 1, handleFunc, args...) } -// Loop 设置一个在特定时间后仿佛运行的调度器 -func (slf *Manager) Loop(name string, after, interval time.Duration, times int, handleFunc interface{}, args ...interface{}) { +// Loop 设置一个在特定时间后反复运行的调度器 +func (slf *Ticker) Loop(name string, after, interval time.Duration, times int, handleFunc interface{}, args ...interface{}) { slf.StopTimer(name) if after < timingWheelTick { @@ -93,7 +93,7 @@ func (slf *Manager) Loop(name string, after, interval time.Duration, times int, total: times, cbFunc: reflect.ValueOf(handleFunc), cbArgs: values, - manager: slf, + ticker: slf, } slf.lock.Lock() @@ -101,4 +101,3 @@ func (slf *Manager) Loop(name string, after, interval time.Duration, times int, scheduler.timer = slf.wheel.ScheduleFunc(scheduler, scheduler.caller) slf.lock.Unlock() } - diff --git a/utils/timer/timer.go b/utils/timer/timer.go index 6811f2e..6e85b37 100644 --- a/utils/timer/timer.go +++ b/utils/timer/timer.go @@ -8,31 +8,31 @@ import ( var timer = new(Timer) -func GetManager(size int) *Manager { - return timer.NewManager(size) +func GetTicker(size int) *Ticker { + return timer.NewTicker(size) } type Timer struct { - Managers []*Manager - lock sync.Mutex + tickers []*Ticker + lock sync.Mutex } -func (slf *Timer) NewManager(size int) *Manager { +func (slf *Timer) NewTicker(size int) *Ticker { slf.lock.Lock() defer slf.lock.Unlock() - var manager *Manager - if len(slf.Managers) > 0 { - manager = slf.Managers[0] - slf.Managers = slf.Managers[1:] - return manager + var ticker *Ticker + if len(slf.tickers) > 0 { + ticker = slf.tickers[0] + slf.tickers = slf.tickers[1:] + return ticker } - manager = &Manager{ + ticker = &Ticker{ timer: slf, wheel: timingwheel.NewTimingWheel(timingWheelTick, int64(size)), timers: make(map[string]*Scheduler), } - manager.wheel.Start() - return manager + ticker.wheel.Start() + return ticker }