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 }