多核逻辑优化

This commit is contained in:
kercylan98 2023-05-20 11:03:40 +08:00
parent 2b50df79e9
commit 84057605b2
1 changed files with 15 additions and 6 deletions

View File

@ -69,7 +69,7 @@ type Server struct {
gServer *gNet // TCP或UDP模式下的服务器 gServer *gNet // TCP或UDP模式下的服务器
messagePool *synchronization.Pool[*message] // 消息池 messagePool *synchronization.Pool[*message] // 消息池
messagePoolSize int // 消息池大小 messagePoolSize int // 消息池大小
messageChannel chan *message // 消息管道 messageChannel map[int]chan *message // 消息管道
initMessageChannel bool // 消息管道是否已经初始化 initMessageChannel bool // 消息管道是否已经初始化
multiple bool // 是否为多服务器模式下运行 multiple bool // 是否为多服务器模式下运行
prod bool // 是否为生产模式 prod bool // 是否为生产模式
@ -111,16 +111,20 @@ func (slf *Server) Run(addr string) error {
data.attrs = nil data.attrs = nil
}, },
) )
slf.messageChannel = make(chan *message, 4096*1000) slf.messageChannel = map[int]chan *message{}
for i := 0; i < slf.core; i++ {
slf.messageChannel[i] = make(chan *message, 4096*1000)
}
if slf.network != NetworkHttp && slf.network != NetworkWebsocket { if slf.network != NetworkHttp && slf.network != NetworkWebsocket {
slf.gServer = &gNet{Server: slf} slf.gServer = &gNet{Server: slf}
} }
if callback != nil { if callback != nil {
go callback() go callback()
} }
for i := 0; i < slf.core; i++ { for _, messageChannel := range slf.messageChannel {
messageChannel := messageChannel
go func() { go func() {
for message := range slf.messageChannel { for message := range messageChannel {
slf.dispatchMessage(message) slf.dispatchMessage(message)
} }
}() }()
@ -344,7 +348,9 @@ func (slf *Server) Shutdown(err error) {
log.Error("Server", zap.Error(shutdownErr)) log.Error("Server", zap.Error(shutdownErr))
} }
} }
close(slf.messageChannel) for _, messageChannel := range slf.messageChannel {
close(messageChannel)
}
slf.messagePool.Close() slf.messagePool.Close()
slf.initMessageChannel = false slf.initMessageChannel = false
} }
@ -389,7 +395,10 @@ func (slf *Server) PushMessage(messageType MessageType, attrs ...any) {
msg := slf.messagePool.Get() msg := slf.messagePool.Get()
msg.t = messageType msg.t = messageType
msg.attrs = attrs msg.attrs = attrs
slf.messageChannel <- msg for _, channel := range slf.messageChannel {
channel <- msg
break
}
} }
// PushCrossMessage 推送跨服消息到特定跨服的服务器中 // PushCrossMessage 推送跨服消息到特定跨服的服务器中