登录
首页 >  Golang >  Go问答

如何在golang中使用2个单独的线程处理2个事件源

来源:stackoverflow

时间:2024-04-23 20:54:32 393浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天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 是在启动时创建的,并且事件是在单独的方法中添加的。目前该方法正在从通道读取事件并处理事件。


正确答案


您可以使用 for select 模式从单个通道读取处理事件并并行处理它们:

var events *EventsChannel

for {
        select {
        case eventA = <-events:
        // handle A
        case eventB = <-events:
        // handle B
        default:
            // unknown type, error case

        }
    }

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何在golang中使用2个单独的线程处理2个事件源》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>