首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在golang中使用两个单独的线程处理2个事件源

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

Stack Overflow用户
提问于 2022-10-10 07:21:45
回答 1查看 39关注 0票数 1

这是一个与设计有关的问题。我遇到的情况是,我的应用程序接收来自它注册的两个不同来源的事件,并且应用程序应该并行地处理来自这两个源的事件。我的应用程序已经在使用缓冲通道处理来自一个源的事件(其中的事件被一个接一个地排队和处理)。现在,我所处的情况是,应用程序需要处理来自不同源的事件,并且不能在这里使用相同的通道,因为应用程序可能需要并行处理这两个源的事件。我正在考虑使用另一个缓冲通道来处理来自第二个事件源的事件。但我担心的是,同样的资源被用来并行地处理2个事件。即使我们使用通道,我们也需要在处理这些事件时再次应用同步。

你能建议我一个更好的方法,任何我可以使用的模式,或者一个设计来处理这种情况吗?

这是我现在从一个源处理事件的代码。

代码语言:javascript
复制
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是在启动时创建的,事件被添加到一个单独的方法中。目前,此方法正在从通道读取事件并处理事件。

EN

回答 1

Stack Overflow用户

发布于 2022-10-10 08:46:56

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

代码语言:javascript
复制
var events *EventsChannel

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

        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74011398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档