From 4f3b4eb1d5a0051e7d57217cb07c0c973359d82c Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Thu, 21 Dec 2023 14:43:59 +0800 Subject: [PATCH] =?UTF-8?q?other:=20=E4=BF=AE=E6=94=B9=20server.WithTicker?= =?UTF-8?q?=20=E5=B0=86=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8=E6=A0=87?= =?UTF-8?q?=E5=87=86=E6=B1=A0=E7=9A=84=E5=AE=9A=E6=97=B6=E5=99=A8=EF=BC=8C?= =?UTF-8?q?=E8=80=8C=E6=98=AF=E8=87=AA=E8=A1=8C=E7=BB=B4=E6=8A=A4=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E5=99=A8=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- examples/internal/ticker-server/main.go | 2 +- server/conn.go | 4 ++-- server/options.go | 14 ++++++++++---- server/server.go | 3 +++ server/server_test.go | 2 +- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b15afec..dd94c44 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ package main import "github.com/kercylan98/minotaur/server" 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 { panic(err) } diff --git a/examples/internal/ticker-server/main.go b/examples/internal/ticker-server/main.go index 680274a..c7a0df5 100644 --- a/examples/internal/ticker-server/main.go +++ b/examples/internal/ticker-server/main.go @@ -3,7 +3,7 @@ package main import "github.com/kercylan98/minotaur/server" 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 { panic(err) } diff --git a/server/conn.go b/server/conn.go index c6fa0e3..cdec322 100644 --- a/server/conn.go +++ b/server/conn.go @@ -279,9 +279,9 @@ func (slf *Conn) Write(packet []byte, callback ...func(err error)) { func (slf *Conn) init() { if slf.server.ticker != nil && slf.server.connTickerSize > 0 { if slf.server.tickerAutonomy { - slf.ticker = timer.GetTicker(slf.server.connTickerSize) + slf.ticker = slf.server.tickerPool.GetTicker(slf.server.connTickerSize) } 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) })) } diff --git a/server/options.go b/server/options.go index 8374a61..61f5f0c 100644 --- a/server/options.go +++ b/server/options.go @@ -32,6 +32,7 @@ type runtime struct { supportMessageTypes map[int]bool // websocket模式下支持的消息类型 certFile, keyFile string // TLS文件 messagePoolSize int // 消息池大小 + tickerPool *timer.Pool // 定时器池 ticker *timer.Ticker // 定时器 tickerAutonomy bool // 定时器是否独立运行 connTickerSize int // 连接定时器大小 @@ -130,17 +131,22 @@ func WithWebsocketReadDeadline(t time.Duration) Option { } // WithTicker 通过定时器创建服务器,为服务器添加定时器功能 +// - poolSize:指定服务器定时器池大小,当池子内的定时器数量超出该值后,多余的定时器在释放时将被回收,该值小于等于 0 时将使用 timer.DefaultTickerPoolSize // - size:服务器定时器时间轮大小 -// - connSize:服务器连接定时器时间轮大小 +// - connSize:服务器连接定时器时间轮大小,当该值小于等于 0 的时候,在新连接建立时将不再为其创建定时器 // - autonomy:定时器是否独立运行(独立运行的情况下不会作为服务器消息运行,会导致并发问题) -func WithTicker(size, connSize int, autonomy bool) Option { +func WithTicker(poolSize, size, connSize int, autonomy bool) Option { return func(srv *Server) { + if poolSize <= 0 { + poolSize = timer.DefaultTickerPoolSize + } + srv.tickerPool = timer.NewPool(poolSize) srv.connTickerSize = connSize srv.tickerAutonomy = autonomy if !autonomy { - srv.ticker = timer.GetTicker(size) + srv.ticker = srv.tickerPool.GetTicker(size) } 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) })) } diff --git a/server/server.go b/server/server.go index d057225..2a700ec 100644 --- a/server/server.go +++ b/server/server.go @@ -493,6 +493,9 @@ func (slf *Server) shutdown(err error) { log.Error("Server", log.Err(shutdownErr)) } } + if slf.tickerPool != nil { + slf.tickerPool.Release() + } if slf.ticker != nil { slf.ticker.Release() } diff --git a/server/server_test.go b/server/server_test.go index d06a3cc..eb998a6 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -11,7 +11,7 @@ import ( func TestNew(t *testing.T) { //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 { // t, c := srv.TimeoutContext(time.Second * 5) // defer c()