feat: 优化 timer 包的 GetTicker 获取到的为内置定时器池中的定时器,可通过 timer.NewTimer 创建定时器池另行使用
This commit is contained in:
parent
2ff7db96d2
commit
1ae1c8d65c
|
@ -15,3 +15,7 @@ const (
|
||||||
const (
|
const (
|
||||||
NoMark = "" // 没有设置标记的定时器
|
NoMark = "" // 没有设置标记的定时器
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DefaultTickerPoolSize = 96
|
||||||
|
)
|
||||||
|
|
|
@ -1,35 +1,55 @@
|
||||||
package timer
|
package timer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/RussellLuo/timingwheel"
|
"github.com/RussellLuo/timingwheel"
|
||||||
)
|
)
|
||||||
|
|
||||||
var tickerPoolSize = 96
|
var (
|
||||||
|
tickerPoolSize = DefaultTickerPoolSize
|
||||||
var timer = new(Timer)
|
standardTimer = NewTimer(tickerPoolSize)
|
||||||
|
)
|
||||||
|
|
||||||
// SetTickerPoolSize 设置定时器池大小
|
// SetTickerPoolSize 设置定时器池大小
|
||||||
// - 默认值为 96,当定时器池中的定时器不足时,会自动创建新的定时器,当定时器释放时,会将多余的定时器进行释放,否则将放入定时器池中
|
// - 默认值为 DefaultTickerPoolSize,当定时器池中的定时器不足时,会自动创建新的定时器,当定时器释放时,会将多余的定时器进行释放,否则将放入定时器池中
|
||||||
func SetTickerPoolSize(size int) {
|
func SetTickerPoolSize(size int) {
|
||||||
if size <= 0 {
|
_ = standardTimer.ChangeTickerPoolSize(size)
|
||||||
panic("ticker pool size must be greater than 0")
|
|
||||||
}
|
|
||||||
timer.lock.Lock()
|
|
||||||
defer timer.lock.Unlock()
|
|
||||||
tickerPoolSize = size
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetTicker(size int, options ...Option) *Ticker {
|
func GetTicker(size int, options ...Option) *Ticker {
|
||||||
return timer.NewTicker(size, options...)
|
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 {
|
type Timer struct {
|
||||||
tickers []*Ticker
|
tickers []*Ticker
|
||||||
lock sync.Mutex
|
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 {
|
func (slf *Timer) NewTicker(size int, options ...Option) *Ticker {
|
||||||
slf.lock.Lock()
|
slf.lock.Lock()
|
||||||
defer slf.lock.Unlock()
|
defer slf.lock.Unlock()
|
||||||
|
|
Loading…
Reference in New Issue