所以我有一個(gè)用于事件處理的通道,主服務(wù)器 goroutine 在這個(gè)通道上選擇并在收到的每個(gè)事件上調(diào)用事件處理程序: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將在事件類型上調(diào)用已注冊的處理程序。我必須func registerEventHandler(typ EventType, func(Event))處理登記冊。該程序?qū)⒅С钟脩艟帉憯U(kuò)展,這意味著他們可以注冊自己的處理程序來處理事件?,F(xiàn)在問題出現(xiàn)在用戶的事件處理程序中,他們可能通過調(diào)用向服務(wù)器發(fā)送新事件addEvent,這將導(dǎo)致服務(wù)器掛起,因?yàn)槭录幚沓绦虮旧硎窃诜?wù)器主循環(huán)的上下文中調(diào)用的(在 for 循環(huán)中)。我該如何優(yōu)雅地處理這種情況?用切片建模的隊(duì)列是個(gè)好主意嗎?
1 回答
天涯盡頭無女友
TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊
為了使事情更加異步,您可以
為事件通道增加容量
evtCh := make(chan Event, 10)異步調(diào)用handleEvent(e)
go handleEvent(e)在處理程序中異步添加事件
go addEvent(e)
或者,如果您希望以確定的順序處理事件,您可以handleEvent(e)直接調(diào)用處理程序而不是addEvent(e)
- 1 回答
- 0 關(guān)注
- 189 瀏覽
添加回答
舉報(bào)
0/150
提交
取消
