Multithreading Akka:针对线程利用率的消息处理
当消息进入邮箱时,调度程序选择一个参与者,恢复它并将其放在操作系统线程上。Java线程与OS线程映射以执行 Actor将使用池中的一个线程,并使用该线程处理消息,然后将该线程释放到池中 演员没有专门的线程。有一个线程池,参与者将使用分配的线程来处理消息,消息处理完成后,线程将被释放。所以,Actor和线程是解耦的 现在让我们举一个例子:Multithreading Akka:针对线程利用率的消息处理,multithreading,akka,Multithreading,Akka,当消息进入邮箱时,调度程序选择一个参与者,恢复它并将其放在操作系统线程上。Java线程与OS线程映射以执行 Actor将使用池中的一个线程,并使用该线程处理消息,然后将该线程释放到池中 演员没有专门的线程。有一个线程池,参与者将使用分配的线程来处理消息,消息处理完成后,线程将被释放。所以,Actor和线程是解耦的 现在让我们举一个例子: public class GreetingActor extends UntypedActor { LoggingAdapter log = Loggi
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”方法中收到消息时-我的问题是何时将actor线程释放回池中-
在onReceive方法中接收消息之后,还是在collectdata()方法执行之后
此外,“消息处理”表示什么
businessImpl.collectdata(sRmsg); // assume this method takes 1 mins for completion
如果这条线路可能需要那么长的时间,那么它应该是
被认为是阻塞呼叫。文档中有一节
这说明了如何安全地处理此类情况:
当在GreetingActor的“onReceive”方法中收到消息时-我的
问题是何时将参与者使用的线程释放回
水池-
在onReceive方法中接收消息后或在执行
collectdata()方法
它将在执行后将线程“释放”回池
长collectdata()调用——因此上面的代码是危险的
我在上面粘贴的链接有一些很好的模式如何处理
如果无法将任务拆分为更小的部分(例如
例如,因为您使用的是无法控制的外部库)
如果你能在短时间内把这个方法分解成更精细的粒度
由参与者处理的任务和消息传递,那么您就不需要
特殊处理
-Endre,Akka团队感谢您从邮件列表中添加我的答案,我不知道它也作为StackOverflow问题发布。