使用GoLang开发游戏服务器(八)
开辟任务池限定业务
之前的框架结构虽然以及能完成逻辑了,但是如果有大量的客户端接入,有一个客户端接入就要对应一个reader的Goroutine和一个writer的Goroutine以及一个处理消息的Goroutine,那么要是有10w个客户端接入,就要有30w个Goroutine,10w个reader和writer是不可避免的,它们处于阻塞状态不会消耗CPU资源,需要优化10w个处理消息的Goroutine
- 我们可以只开辟一定数量的Goroutine来进行处理,大大优化效率
- 修改messagehandler结构体
- 再messagehandler结构体中新增方法
func (m *MessageHandler) SendMsgToTaskQueue(request ziface.IRequest) {
workerID := request.GetConnection().GetConnectionID() % int(utils.GlobalObject.WorkerPoolSize)
m.TaskQueue[workerID] <- request
}
func (m *MessageHandler) StartWorkerPool() {
for i := 0; i < int(utils.GlobalObject.WorkerPoolSize); i++ {
m.TaskQueue[i] = make(chan ziface.IRequest, utils.GlobalObject.MaxWorkerTaskLength)
go m.StartOneWorker(i, m.TaskQueue[i])
}
}
func (m *MessageHandler) StartOneWorker(workerID int, workerChannel chan ziface.IRequest) {
fmt.Println("Worker ID:", workerID, "Is Start...")
for true {
select {
case req := <-workerChannel:
m.DoMessageHandler(req)
}
}
}
- 修改connection中的StartReader方法
- 在Server的入口Start中添加开启工作池的方法