other: 修改 server.WithTicker 将不再使用标准池的定时器,而是自行维护定时器池

This commit is contained in:
kercylan98 2023-12-21 14:43:59 +08:00
parent ae98963ecc
commit 4f3b4eb1d5
6 changed files with 18 additions and 9 deletions

View File

@ -158,7 +158,7 @@ package main
import "github.com/kercylan98/minotaur/server" import "github.com/kercylan98/minotaur/server"
func main() { func main() {
srv := server.New(server.NetworkWebsocket, server.WithTicker(50, 10, false)) srv := server.New(server.NetworkWebsocket, server.WithTicker(-1, 50, 10, false))
if err := srv.Run(":9999"); err != nil { if err := srv.Run(":9999"); err != nil {
panic(err) panic(err)
} }

View File

@ -3,7 +3,7 @@ package main
import "github.com/kercylan98/minotaur/server" import "github.com/kercylan98/minotaur/server"
func main() { func main() {
srv := server.New(server.NetworkWebsocket, server.WithTicker(50, 10, false)) srv := server.New(server.NetworkWebsocket, server.WithTicker(-1, 50, 10, false))
if err := srv.Run(":9999"); err != nil { if err := srv.Run(":9999"); err != nil {
panic(err) panic(err)
} }

View File

@ -279,9 +279,9 @@ func (slf *Conn) Write(packet []byte, callback ...func(err error)) {
func (slf *Conn) init() { func (slf *Conn) init() {
if slf.server.ticker != nil && slf.server.connTickerSize > 0 { if slf.server.ticker != nil && slf.server.connTickerSize > 0 {
if slf.server.tickerAutonomy { if slf.server.tickerAutonomy {
slf.ticker = timer.GetTicker(slf.server.connTickerSize) slf.ticker = slf.server.tickerPool.GetTicker(slf.server.connTickerSize)
} else { } else {
slf.ticker = timer.GetTicker(slf.server.connTickerSize, timer.WithCaller(func(name string, caller func()) { slf.ticker = slf.server.tickerPool.GetTicker(slf.server.connTickerSize, timer.WithCaller(func(name string, caller func()) {
slf.server.PushShuntTickerMessage(slf, name, caller) slf.server.PushShuntTickerMessage(slf, name, caller)
})) }))
} }

View File

@ -32,6 +32,7 @@ type runtime struct {
supportMessageTypes map[int]bool // websocket模式下支持的消息类型 supportMessageTypes map[int]bool // websocket模式下支持的消息类型
certFile, keyFile string // TLS文件 certFile, keyFile string // TLS文件
messagePoolSize int // 消息池大小 messagePoolSize int // 消息池大小
tickerPool *timer.Pool // 定时器池
ticker *timer.Ticker // 定时器 ticker *timer.Ticker // 定时器
tickerAutonomy bool // 定时器是否独立运行 tickerAutonomy bool // 定时器是否独立运行
connTickerSize int // 连接定时器大小 connTickerSize int // 连接定时器大小
@ -130,17 +131,22 @@ func WithWebsocketReadDeadline(t time.Duration) Option {
} }
// WithTicker 通过定时器创建服务器,为服务器添加定时器功能 // WithTicker 通过定时器创建服务器,为服务器添加定时器功能
// - poolSize指定服务器定时器池大小当池子内的定时器数量超出该值后多余的定时器在释放时将被回收该值小于等于 0 时将使用 timer.DefaultTickerPoolSize
// - size服务器定时器时间轮大小 // - size服务器定时器时间轮大小
// - connSize服务器连接定时器时间轮大小 // - connSize服务器连接定时器时间轮大小,当该值小于等于 0 的时候,在新连接建立时将不再为其创建定时器
// - autonomy定时器是否独立运行独立运行的情况下不会作为服务器消息运行会导致并发问题 // - autonomy定时器是否独立运行独立运行的情况下不会作为服务器消息运行会导致并发问题
func WithTicker(size, connSize int, autonomy bool) Option { func WithTicker(poolSize, size, connSize int, autonomy bool) Option {
return func(srv *Server) { return func(srv *Server) {
if poolSize <= 0 {
poolSize = timer.DefaultTickerPoolSize
}
srv.tickerPool = timer.NewPool(poolSize)
srv.connTickerSize = connSize srv.connTickerSize = connSize
srv.tickerAutonomy = autonomy srv.tickerAutonomy = autonomy
if !autonomy { if !autonomy {
srv.ticker = timer.GetTicker(size) srv.ticker = srv.tickerPool.GetTicker(size)
} else { } else {
srv.ticker = timer.GetTicker(size, timer.WithCaller(func(name string, caller func()) { srv.ticker = srv.tickerPool.GetTicker(size, timer.WithCaller(func(name string, caller func()) {
srv.PushTickerMessage(name, caller) srv.PushTickerMessage(name, caller)
})) }))
} }

View File

@ -493,6 +493,9 @@ func (slf *Server) shutdown(err error) {
log.Error("Server", log.Err(shutdownErr)) log.Error("Server", log.Err(shutdownErr))
} }
} }
if slf.tickerPool != nil {
slf.tickerPool.Release()
}
if slf.ticker != nil { if slf.ticker != nil {
slf.ticker.Release() slf.ticker.Release()
} }

View File

@ -11,7 +11,7 @@ import (
func TestNew(t *testing.T) { func TestNew(t *testing.T) {
//limiter := rate.NewLimiter(rate.Every(time.Second), 100) //limiter := rate.NewLimiter(rate.Every(time.Second), 100)
srv := server.New(server.NetworkWebsocket, server.WithTicker(200, 10, false), server.WithMessageBufferSize(1024*1024), server.WithPProf()) srv := server.New(server.NetworkWebsocket, server.WithTicker(-1, 200, 10, false), server.WithMessageBufferSize(1024*1024), server.WithPProf())
//srv.RegMessageExecBeforeEvent(func(srv *server.Server, message *server.Message) bool { //srv.RegMessageExecBeforeEvent(func(srv *server.Server, message *server.Message) bool {
// t, c := srv.TimeoutContext(time.Second * 5) // t, c := srv.TimeoutContext(time.Second * 5)
// defer c() // defer c()