使用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中添加开启工作池的方法
    在这里插入图片描述