other: 修改 server.WithTicker 将不再使用标准池的定时器,而是自行维护定时器池
This commit is contained in:
parent
ae98963ecc
commit
4f3b4eb1d5
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue