From 50181c7ecbcd2f9d37c9a3ceceed88dc6143444f Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Thu, 21 Dec 2023 14:37:17 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E4=BF=AE=E6=94=B9=20timer.Timer=20?= =?UTF-8?q?=E5=90=8D=E5=AD=97=E4=B8=BA=20timer.Pool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/timer/pool.go | 61 ++++++++++++++++++++++++++++++++++++++ utils/timer/ticker.go | 5 ++-- utils/timer/timer.go | 69 ++++--------------------------------------- 3 files changed, 70 insertions(+), 65 deletions(-) create mode 100644 utils/timer/pool.go diff --git a/utils/timer/pool.go b/utils/timer/pool.go new file mode 100644 index 0000000..390d3fa --- /dev/null +++ b/utils/timer/pool.go @@ -0,0 +1,61 @@ +package timer + +import ( + "fmt" + "sync" + + "github.com/RussellLuo/timingwheel" +) + +// NewPool 创建一个定时器池,当 tickerPoolSize 小于等于 0 时,将会引发 panic,可指定为 DefaultTickerPoolSize +func NewPool(tickerPoolSize int) *Pool { + if tickerPoolSize <= 0 { + panic(fmt.Errorf("timer tickerPoolSize must greater than 0, got: %d", tickerPoolSize)) + } + return &Pool{ + tickerPoolSize: tickerPoolSize, + } +} + +// Pool 定时器池 +type Pool struct { + tickers []*Ticker + lock sync.Mutex + tickerPoolSize int +} + +// ChangePoolSize 改变定时器池大小 +// - 当传入的大小小于或等于 0 时,将会返回错误,并且不会发生任何改变 +func (slf *Pool) ChangePoolSize(size int) error { + if size <= 0 { + return fmt.Errorf("timer tickerPoolSize must greater than 0, got: %d", tickerPoolSize) + } + slf.lock.Lock() + defer slf.lock.Unlock() + slf.tickerPoolSize = size + return nil +} + +// GetTicker 获取一个新的定时器 +func (slf *Pool) GetTicker(size int, options ...Option) *Ticker { + slf.lock.Lock() + defer slf.lock.Unlock() + + var ticker *Ticker + if len(slf.tickers) > 0 { + ticker = slf.tickers[0] + slf.tickers = slf.tickers[1:] + return ticker + } + + ticker = &Ticker{ + timer: slf, + wheel: timingwheel.NewTimingWheel(timingWheelTick, int64(size)), + timers: make(map[string]*Scheduler), + } + for _, option := range options { + option(ticker) + } + ticker.wheel.Start() + return ticker +} diff --git a/utils/timer/ticker.go b/utils/timer/ticker.go index 470498d..4e05840 100644 --- a/utils/timer/ticker.go +++ b/utils/timer/ticker.go @@ -11,10 +11,11 @@ import ( // Ticker 定时器 type Ticker struct { - timer *Timer + timer *Pool wheel *timingwheel.TimingWheel timers map[string]*Scheduler lock sync.RWMutex + handle func(name string, caller func()) mark string } @@ -25,7 +26,7 @@ func (slf *Ticker) Mark() string { return slf.mark } -// Release 释放定时器,并将定时器重新放回 Timer 池中 +// Release 释放定时器,并将定时器重新放回 Pool 池中 func (slf *Ticker) Release() { slf.timer.lock.Lock() defer slf.timer.lock.Unlock() diff --git a/utils/timer/timer.go b/utils/timer/timer.go index 2a410e4..e20d806 100644 --- a/utils/timer/timer.go +++ b/utils/timer/timer.go @@ -1,74 +1,17 @@ package timer -import ( - "fmt" - "sync" - - "github.com/RussellLuo/timingwheel" -) - var ( tickerPoolSize = DefaultTickerPoolSize - standardTimer = NewTimer(tickerPoolSize) + standardPool = NewPool(tickerPoolSize) ) -// SetTickerPoolSize 设置定时器池大小 +// SetPoolSize 设置标准池定时器池大小 // - 默认值为 DefaultTickerPoolSize,当定时器池中的定时器不足时,会自动创建新的定时器,当定时器释放时,会将多余的定时器进行释放,否则将放入定时器池中 -func SetTickerPoolSize(size int) { - _ = standardTimer.ChangeTickerPoolSize(size) +func SetPoolSize(size int) { + _ = standardPool.ChangePoolSize(size) } +// GetTicker 获取标准池中的一个定时器 func GetTicker(size int, options ...Option) *Ticker { - return standardTimer.NewTicker(size, options...) -} - -func NewTimer(tickerPoolSize int) *Timer { - if tickerPoolSize <= 0 { - panic(fmt.Errorf("timer tickerPoolSize must greater than 0, got: %d", tickerPoolSize)) - } - return &Timer{ - tickerPoolSize: tickerPoolSize, - } -} - -type Timer struct { - tickers []*Ticker - lock sync.Mutex - tickerPoolSize int -} - -// ChangeTickerPoolSize 改变定时器池大小 -// - 当传入的大小小于或等于 0 时,将会返回错误,并且不会发生任何改变 -func (slf *Timer) ChangeTickerPoolSize(size int) error { - if size <= 0 { - return fmt.Errorf("timer tickerPoolSize must greater than 0, got: %d", tickerPoolSize) - } - slf.lock.Lock() - defer slf.lock.Unlock() - slf.tickerPoolSize = size - return nil -} - -// NewTicker 获取一个新的定时器 -func (slf *Timer) NewTicker(size int, options ...Option) *Ticker { - slf.lock.Lock() - defer slf.lock.Unlock() - - var ticker *Ticker - if len(slf.tickers) > 0 { - ticker = slf.tickers[0] - slf.tickers = slf.tickers[1:] - return ticker - } - - ticker = &Ticker{ - timer: slf, - wheel: timingwheel.NewTimingWheel(timingWheelTick, int64(size)), - timers: make(map[string]*Scheduler), - } - for _, option := range options { - option(ticker) - } - ticker.wheel.Start() - return ticker + return standardPool.GetTicker(size, options...) }