所以我有一个用于事件处理的通道,主服务器 goroutine 在这个通道上选择并在收到的每个事件上调用事件处理程序:evtCh := make(chan Event)// server loop:for !quit { select { case e := <- evtCh: handleEvent(e) break case quit := <-quitCh: //finish}// for send a new event to processingfunc addEvent(e Event) { evtCh <- e}handleEvent将在事件类型上调用已注册的处理程序。我必须func registerEventHandler(typ EventType, func(Event))处理登记册。该程序将支持用户编写扩展,这意味着他们可以注册自己的处理程序来处理事件。现在问题出现在用户的事件处理程序中,他们可能通过调用向服务器发送新事件addEvent,这将导致服务器挂起,因为事件处理程序本身是在服务器主循环的上下文中调用的(在 for 循环中)。我该如何优雅地处理这种情况?用切片建模的队列是个好主意吗?
1 回答
天涯尽头无女友
TA贡献1831条经验 获得超9个赞
为了使事情更加异步,您可以
为事件通道增加容量
evtCh := make(chan Event, 10)
异步调用handleEvent(e)
go handleEvent(e)
在处理程序中异步添加事件
go addEvent(e)
或者,如果您希望以确定的顺序处理事件,您可以handleEvent(e)
直接调用处理程序而不是addEvent(e)
- 1 回答
- 0 关注
- 154 浏览
添加回答
举报
0/150
提交
取消