当前位置: > > > > 如何在golang中使用2个单独的线程处理2个事件源
来源:stackoverflow
2024-04-23 20:54:32
0浏览
收藏
在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天就整理分享《如何在golang中使用2个单独的线程处理2个事件源》,聊聊,希望可以帮助到正在努力赚钱的你。
问题内容
这是一个与设计相关的问题。我遇到的情况是,我的应用程序从其注册的两个不同源接收事件,并且应用程序应该并行处理来自这两个源的事件。我的应用程序已经使用缓冲通道处理来自一个源的事件(其中事件排队并一个接一个地处理)。现在,我面临的情况是应用程序需要处理来自不同源的事件,并且我无法在此处使用相同的通道,因为应用程序可能必须并行处理来自这两个源的事件。我正在考虑使用另一个缓冲通道来处理来自第二个事件源的事件。但我担心相同的资源被用来并行处理 2 个事件。即使我们使用通道,我们也需要在处理这些事件时再次应用同步。
您能否建议我一种更好的方法、我可以使用的任何模式或处理这种情况的设计?
这是我现在处理来自一个源的事件的代码
for event := range thisObj.channel { log.Printf("Found a new event '%s' to process at the state %s", event, thisObj.currentState) stateins := thisObj.statesMap[thisObj.currentState] // This is separate go routine. Hence acuire the lock before calling a state to process the event. thisObj.mu.Lock() stateins.ProcessState(event.EventType, event.EventData) thisObj.mu.Unlock() }
这里 thisobj.channel 是在启动时创建的,并且事件是在单独的方法中添加的。目前该方法正在从通道读取事件并处理事件。
正确答案
您可以使用 模式从单个通道读取处理事件并并行处理它们:
var events *EventsChannel for { select { case eventA = <-events: // handle A case eventB = <-events: // handle B default: // unknown type, error case } }
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何在golang中使用2个单独的线程处理2个事件源》文章吧,也可关注公众号了解相关技术文章。