zinx icon indicating copy to clipboard operation
zinx copied to clipboard

关于`MsgHandle`的一点疑问

Open LiMoMoMo opened this issue 6 years ago • 4 comments

例子中的PingRouterHelloZinxRouter应该是不同的业务逻辑处理。 如果在业务处理中有耗时或者阻塞的操作,根据这里的写法,MsgHandle, 这个业务处理流程岂不是接收不到后面的请求了?

希望得到大佬的回复。谢谢!

LiMoMoMo avatar Aug 20 '19 07:08 LiMoMoMo

不会,参考connection.go

go c.MsgHandler.DoMsgHandler(&req)

执行是用一个go单独运行的

aceld avatar Aug 22 '19 09:08 aceld

if utils.GlobalObject.WorkerPoolSize > 0 {
    //已经启动工作池机制,将消息交给Worker处理
    c.MsgHandler.SendMsgToTaskQueue(&req)
} else {
    //从绑定好的消息和对应的处理方法中执行对应的Handle方法
    go c.MsgHandler.DoMsgHandler(&req)
}

谢谢大佬的回复。 这里默认的WorkerPoolSize10,也就是如果启动工作池机制,这个问题还是会存在呀。

LiMoMoMo avatar Aug 23 '19 06:08 LiMoMoMo

c.MsgHandler.SendMsgToTaskQueue(&req) 这里面是有缓冲chan 不会阻塞啦, 具体的业务在go mh.StartOneWorker(i, mh.TaskQueue[i]) 里

lumigogogo avatar Nov 27 '20 08:11 lumigogogo

for {
	select {
		//有消息则取出队列的Request,并执行绑定的业务方法
		case request := <-taskQueue:
			mh.DoMsgHandler(request)
	}
}

这里的操作是会阻塞的呀!耗时的业务操作还是得异步,又会存在后发的请求先到的问题。忘大佬解答。

LittleFly99 avatar Apr 07 '22 08:04 LittleFly99