【问题标题】:Akka : message processing against thread utilizationAkka:针对线程利用率的消息处理
【发布时间】:2013-02-20 11:39:31
【问题描述】:

当消息进入邮箱时,调度程序选择一个actor,恢复它并将它放在操作系统线程上。 Java 线程映射到 OS 线程来执行。

Actor 将使用池中的一个线程,并使用该线程处理消息并将线程释放到池中。

Actor 没有专用线程。有一个线程池,参与者将使用分配的线程来处理消息,一旦消息处理完成,线程将被释放。因此,Actor 与线程解耦。

现在举个例子:

public class GreetingActor extends UntypedActor {
    LoggingAdapter log = Logging.getLogger(getContext().system(), this);

    public void onReceive(Object message) throws Exception {
        if (message instanceof String) {
            String sRmsg = (String) message;
            businessImpl.collectdata(sRmsg); // assume this method takes 1 mins for completion
        }
    }
}


ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(new Props(GreetingActor.class), "greeter");
greeter.tell("Charlie Parker");

这里,greeter actor 使用 tell 方法发送消息,因此该消息将进入邮箱队列,调度程序将从队列中选择消息并使用该消息调用 actor。

当在 GreetingActor 的 'onReceive' 方法中接收到消息时 - 我的问题是演员使用的线程何时会被释放回池中 - 在 onReceive 方法中接收消息之后还是在执行 collectdata() 方法之后?

另外,“消息处理”表示什么?

【问题讨论】:

    标签: multithreading akka


    【解决方案1】:
    businessImpl.collectdata(sRmsg); // assume this method takes 1 mins for completion
    

    如果这条线可能会花费那么多时间,那么它应该是 被视为阻塞调用。文档中有一段 这解释了如何安全地处理此类情况:

    http://doc.akka.io/docs/akka/2.1.0/general/actor-systems.html#blocking-needs-careful-management

    当在 GreetingActor 的 'onReceive' 方法中收到消息时 - 我的 问题是演员使用的线程何时会被释放回 水池- 在 onReceive 方法中接收到消息之后或在执行 collectdata() 方法?

    它会在执行完线程后将线程“释放”回池中 很长的 collectdata() 调用——因此上面的代码很危险。

    我在上面粘贴的链接有一些很好的模式如何解决 这个,如果你不能把任务分成更小的部分(对于 例如,因为您使用了一个您无法控制的外部库)。

    如果您可以在短时间内将该方法拆分为更精细的粒度 演员处理的任务和消息传递,那么你不需要 特殊处理。

    -恩德雷,
    阿卡团队

    【讨论】:

    • 感谢您从邮件列表中添加我的答案,我不知道它也是作为 StackOverflow 问题发布的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多