【发布时间】:2016-05-02 12:22:16
【问题描述】:
所以我有一个用于事件处理的通道,主服务器 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 循环中)。
我该如何优雅地处理这种情况?用切片建模的队列是个好主意吗?
【问题讨论】: