为了账号安全,请及时绑定邮箱和手机立即绑定

事件处理中的死锁

事件处理中的死锁

Go
慕妹3242003 2022-01-10 10:22:20
所以我有一个用于事件处理的通道,主服务器 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)


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信