github.com/binbinly/pkg@v0.0.11-0.20240321014439-f4fbf666eb0f/transport/ws/handler.go (about)

     1  package ws
     2  
     3  // Handler 消息处理器
     4  type Handler struct {
     5  	size   int             //work池大小
     6  	engine *Engine         //路由处理
     7  	queue  []chan *Request //Worker负责取任务的消息队列
     8  }
     9  
    10  // NewHandler 实例化消息处理器
    11  func NewHandler(size int, e *Engine) *Handler {
    12  	return &Handler{
    13  		engine: e,
    14  		size:   size,
    15  		queue:  make([]chan *Request, size),
    16  	}
    17  }
    18  
    19  // Init 初始化work池
    20  func (h *Handler) Init(len int) {
    21  	for i := 0; i < h.size; i++ {
    22  		//初始化
    23  		h.queue[i] = make(chan *Request, len)
    24  		//启动当前Worker,阻塞的等待对应的任务队列是否有消息传递进来
    25  		go h.startWorker(h.queue[i])
    26  	}
    27  }
    28  
    29  // Execute 消息处理
    30  func (h *Handler) Execute(r *Request) {
    31  	h.engine.Start(r)
    32  }
    33  
    34  // AsyncExecute 异步消息处理
    35  func (h *Handler) AsyncExecute(r *Request) {
    36  	//轮询分发任务
    37  	h.queue[r.Conn().GetID()%uint64(h.size)] <- r
    38  }
    39  
    40  func (h *Handler) startWorker(queue chan *Request) {
    41  	for {
    42  		select {
    43  		case r := <-queue:
    44  			h.Execute(r)
    45  		}
    46  	}
    47  }