8.4 Zinx-V0.8代码实现

    所以应该在Connection的StartReader()方法中修改:

    1. /*
    2. 读消息Goroutine,用于从客户端中读取数据
    3. */
    4. func (c *Connection) StartReader() {
    5. fmt.Println("Reader Goroutine is running")
    6. defer fmt.Println(c.RemoteAddr().String(), " conn reader exit!")
    7. defer c.Stop()
    8. for {
    9. //读取客户端的Msg head...
    10. //拆包,得到msgid 和 datalen 放在msg中...
    11. //根据 dataLen 读取 data,放在msg.Data中...
    12. //得到当前客户端请求的Request数据
    13. req := Request{
    14. conn:c,
    15. if utils.GlobalObject.WorkerPoolSize > 0 {
    16. //已经启动工作池机制,将消息交给Worker处理
    17. c.MsgHandler.SendMsgToTaskQueue(&req)
    18. } else {
    19. //从绑定好的消息和对应的处理方法中执行对应的Handle方法
    20. go c.MsgHandler.DoMsgHandler(&req)
    21. }
    22. }

    这里并没有强制使用多任务Worker机制,而是判断用户配置WorkerPoolSize的个数,如果大于0,那么我就启动多任务机制处理链接请求消息,如果=0或者<0那么,我们依然只是之前的开启一个临时的Goroutine处理客户端请求消息。