zinx
zinx copied to clipboard
关于`MsgHandle`的一点疑问
例子中的PingRouter和HelloZinxRouter应该是不同的业务逻辑处理。
如果在业务处理中有耗时或者阻塞的操作,根据这里的写法,MsgHandle, 这个业务处理流程岂不是接收不到后面的请求了?
希望得到大佬的回复。谢谢!
不会,参考connection.go
go c.MsgHandler.DoMsgHandler(&req)
执行是用一个go单独运行的
if utils.GlobalObject.WorkerPoolSize > 0 {
//已经启动工作池机制,将消息交给Worker处理
c.MsgHandler.SendMsgToTaskQueue(&req)
} else {
//从绑定好的消息和对应的处理方法中执行对应的Handle方法
go c.MsgHandler.DoMsgHandler(&req)
}
谢谢大佬的回复。
这里默认的WorkerPoolSize是10,也就是如果启动工作池机制,这个问题还是会存在呀。
c.MsgHandler.SendMsgToTaskQueue(&req) 这里面是有缓冲chan 不会阻塞啦, 具体的业务在go mh.StartOneWorker(i, mh.TaskQueue[i]) 里
for {
select {
//有消息则取出队列的Request,并执行绑定的业务方法
case request := <-taskQueue:
mh.DoMsgHandler(request)
}
}
这里的操作是会阻塞的呀!耗时的业务操作还是得异步,又会存在后发的请求先到的问题。忘大佬解答。