多核逻辑优化

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