所以我有一个用于事件处理的通道,主服务器 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 processing
func addEvent(e Event) {
evtCh <- e
}
handleEvent将在事件类型上调用已注册的处理程序。我必须func registerEventHandler(typ EventType, func(Event))处理登记册。该程序将支持用户编写扩展,这意味着他们可以注册自己的处理程序来处理事件。
现在问题出现在用户的事件处理程序中,他们可能通过调用向服务器发送新事件addEvent,这将导致服务器挂起,因为事件处理程序本身是在服务器主循环的上下文中调用的(在 for 循环中)。
我该如何优雅地处理这种情况?用切片建模的队列是个好主意吗?
天涯尽头无女友
相关分类