使用GoLang开发游戏服务器(八)

本文介绍了如何使用GoLang优化游戏服务器,通过限制任务池大小来减少Goroutine的数量,以应对大量客户端接入。在原有的框架基础上,创建了一个固定数量的工作池,每个工作线程从任务队列中取出请求进行处理,从而提高服务器处理效率。
摘要由CSDN通过智能技术生成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值