如果你想同时执行长时间运行的计算(在一台机器上),Akka演员可以提供帮助。
一种方法是为每件作品生成一个新演员。像
这样的东西while(true) {
val actor = system.actorOf(Props[ProcessingActor])
(actor ? msg).map {
...
system.stop(actor)
}
}
第二个想法是在路由器后面配置一定数量的actor。然后将所有消息发送到路由器。
val router = system.actorOf(Props[ProcessingActor].withRouter(RoundRobinRouter(nrOfInstances = 5)))
while(true) {
(router ? msg).map { ... }
}
我想知道,如果系统过载会更好(传入消息的速率高于处理速率)?
哪个会持续更长时间?并且最终是否会以OOMError炸毁系统?
答案 0 :(得分:4)
在为每项任务创建新Actor
之前,您还可以使用Future
。这实际上取决于你想要达到的目标。要使用最少的内存使用完成尽可能多的工作,您应该使用actor /路由器方法。期货更昂贵,因为每项任务都会创建Future
和Promise
的新实例。但这实际上取决于您的用例,哪种方法更好。当真的不需要它们时,我就不会创造很多演员。特别是当system.actorOf
总是创建一个新的错误内核。