事件处理中的死锁

所以我有一个用于事件处理的通道,主服务器 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 循环中)。


我该如何优雅地处理这种情况?用切片建模的队列是个好主意吗?


慕妹3242003
浏览 182回答 1
1回答

天涯尽头无女友

为了使事情更加异步,您可以为事件通道增加容量evtCh := make(chan Event, 10)异步调用handleEvent(e)go handleEvent(e)在处理程序中异步添加事件go addEvent(e)或者,如果您希望以确定的顺序处理事件,您可以handleEvent(e)直接调用处理程序而不是addEvent(e)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go