那么除了机器的功能以及您正在运行多少其他功能之外,还没有真正的最大值。如果你有足够的资源可以运行10米。然而,如果你想要运行很多演员,我会说你可能有一个很重要的阻塞问题,或者你不了解演员如何使用这个池。
部署的actor不拥有像旧线程池执行程序模式那样的线程。它只在处理消息时使用线程,然后在处理消息时将线程退回给调度程序。这样调度员重新使用这些线程。因此,池中演员人数的配置将取决于您是否可以从演员中获得带宽。如果您的邮件太少,将开始在收件箱中进行备份,如果您的邮件太多,您可能会将这些资源用于其他内容。你会惊讶于你很少有演员需要用多线程执行者来满足你之前正在做的事情。
现在,如果您在这些参与者中有很长时间的运行进程,那么您应该考虑将这些进程卸载到存在的进程中,以便处理这个长时间运行的进程。比方说,例如,您的演员将主要处理需要几毫秒才能完成的普通数据库操作,但您发送的一对消息会调用分析数据库搜索,可能需要10到30秒才能返回。在计算方面,这是一个永恒。因此,对于这些进程,最好让数据库角色分离Per-Task Actor。这是一个演员,只存在于服务某个特定的请求,然后在回送响应后自行停止。一般过程如下:
context.actorOf(Props(classOf[PerTaskActor], sender(), message)
这将创建一个新的演员这个演员。如果您想创建顶级actor,请调用system.actorOf(...)。构造函数看起来像:
class PerTaskActor(replyTo: ActorRef, msg: MyLongProcessMessage) {
// ....
}
然后男主角里面我们运行的过程中,完成后:
replyTo.tell(result)
context.stop(self)
这样您的长时间运行的任务被卸载。我会建议你不要让这些演员的脆弱演员的孩子,可以崩溃很多,因为如果父演员崩溃,它会取消所有的孩子。你可能需要一个特殊的父母角色(而不是路由角色)。