diff --git a/utils/timer/pool.go b/utils/timer/pool.go index 390d3fa..dc987ac 100644 --- a/utils/timer/pool.go +++ b/utils/timer/pool.go @@ -22,6 +22,7 @@ type Pool struct { tickers []*Ticker lock sync.Mutex tickerPoolSize int + closed bool } // ChangePoolSize 改变定时器池大小 @@ -59,3 +60,17 @@ func (slf *Pool) GetTicker(size int, options ...Option) *Ticker { ticker.wheel.Start() return ticker } + +// Release 释放定时器池的资源,释放后由其产生的 Ticker 在 Ticker.Release 后将不再回到池中,而是直接释放 +// - 虽然定时器池已被释放,但是依旧可以产出 Ticker +func (slf *Pool) Release() { + slf.lock.Lock() + defer slf.lock.Unlock() + slf.closed = true + for _, ticker := range slf.tickers { + ticker.wheel.Stop() + } + slf.tickers = nil + slf.tickerPoolSize = 0 + return +} diff --git a/utils/timer/ticker.go b/utils/timer/ticker.go index 4e05840..337419c 100644 --- a/utils/timer/ticker.go +++ b/utils/timer/ticker.go @@ -39,7 +39,7 @@ func (slf *Ticker) Release() { } slf.lock.Unlock() - if len(slf.timer.tickers) < tickerPoolSize { + if len(slf.timer.tickers) < tickerPoolSize && !slf.timer.closed { slf.timer.tickers = append(slf.timer.tickers, slf) } else { slf.wheel.Stop()