【问题标题】:Does Akka onReceive method execute concurrently?Akka onReceive 方法是否同时执行?
【发布时间】:2012-07-25 06:27:21
【问题描述】:

这是我的场景:

我有一个主actor,它接收来自多个子actor的消息。这些消息包含要聚合的数据。在这个聚合逻辑中,如果我使用共享数据结构来收集聚合,我是否需要处理同步问题?

else if(arg0 instanceof ReducedMsg){

                           ReducedMsg reduced = (ReducedMsg)arg0;
        counter.decrementAndGet();

        synchronized(finalResult){

            finalResult.add((KeyValue<K, V>) reduced.getReduced());

            if(counter.get() == 0){
                                    if(checkAndReduce(finalResult)){

                    finalResult.clear();
                }
                else{
                    stop();
                    latch.countDown();
                }

            }

        }



    }

如您所见,我有一个 finalResult,每条消息都将汇总到该结果中,并且在处理逻辑之后,还需要清除集合。

实际上我正在尝试实现的是递归(关联)归约 mapreduce。所以我需要保持我假设的同步块?或者 Akka 是否有机会一次执行 onReceive 一个线程?

此逻辑在小型数据集上产生准确且可预测的结果。我的问题是当我的输入数据集有点大时,代码会挂起。我想确定这是因为我的同步块的上下文切换,所以我可能会深入到不同的设计中。

【问题讨论】:

    标签: synchronization actor akka


    【解决方案1】:

    onReceive()从不同时调用。这是 Akka 给你的最根本的保证。

    这意味着如果您的counter 变量是actor 中的一个字段并且没有其他代码可以直接访问该字段,您可以安全地使用普通int/long 而不是AtomicInteger/@987654327 @。假设 finalResult 是一个封装并隐藏在 actor 中的字段,也不需要同步 finalResult

    最后CountDownLatch 的使用是可疑的。在 Akka 应用程序中,您不应该使用任何同步原语。 Actor 本质上是单线程的,所有的通信(包括唤醒和传递数据)都应该通过消息传递来实现。

    这在文档中都有解释:http://doc.akka.io/docs/akka/2.0.2/general/jmm.html#Actors_and_the_Java_Memory_Model

    【讨论】:

    • 谢谢托马斯。您的第一行清除了我的许多疑问! Regd 使用闩锁,我必须这样做以提供一个客户端界面,该界面应该等到演员处理完成。我的目标是开发一个java框架,内部使用Akka/Scala来处理。
    • @sutanudalui:你可以同步地调用actor,这实质上意味着Akka会在一些临时队列上等待响应。无需手动执行此操作。请参阅 Akka 文档以了解 ask(相对于 tell)消息模式。
    • 好的。我会更深入一点。我有一个带有 N 个从属角色的循环路由器。我打算做一个并行处理,然后累积结果。所以主actor在接收到每个输入时,路由到其中一个从属。从站在处理消息时,将消息发送回必须聚合的主站。这个聚合阶段我正在考虑同步问题。从提供的文档链接中,我看到 Akka 无法保证(我猜不出任何人!)共享内存,在我的情况下,“finalResult”将受到保护。我理解正确吗?
    • @sutanudalui:这就是 Akka 的美妙之处——即使所有的 slave 同时完成,它们的响应消息也会在 master 的邮箱中排队并一个接一个地处理。因此,您不必担心同步、竞争条件等。
    • 明白你的意思。将尝试审查我的设计。感谢大家的帮助!
    猜你喜欢
    • 2011-03-10
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多