3

如果您想同时执行长时间运行的计算(在单台机器上),Akka actor 可以提供帮助。

一种方法是为每件作品生成一个新演员。就像是

while(true) {
    val actor = system.actorOf(Props[ProcessingActor])
    (actor ? msg).map { 
        ... 
        system.stop(actor)
    }
}

第二个想法是在路由器后面配置一定数量的参与者。然后将所有消息发送到路由器。

val router = system.actorOf(Props[ProcessingActor].withRouter(RoundRobinRouter(nrOfInstances = 5)))
while(true) {
    (router ? msg).map { ... }
}

我想知道,如果系统过载(传入消息的速率高于处理速率),哪个更好?

哪个会持续更长时间?两者最终都会用 OOMError 炸毁系统吗?

4

1 回答 1

4

在为每个任务创建新任务之前,Actor您也可以只使用Future. 这实际上取决于您想要实现的目标。为了以最少的内存使用完成尽可能多的工作,您应该使用参与者/路由器方法。期货更昂贵,因为每个任务都会创建一个新的Futureand实例Promise。但这实际上取决于您的用例,哪种方法更好。我只是不会创造很多演员,当真的不需要他们的时候。特别是system.actorOf一如既往地创建一个新的错误内核。

于 2012-05-02T13:18:47.163 回答