在Scala中,期货何时比Actors更合适(反之亦然)?

时间:2013-04-19 20:46:04

标签: scala concurrency actor future

假设我需要运行一些并发任务。

我可以将每个任务包装在Future中并等待它们完成。或者,我可以为每个任务创建Actor。每个Actor将执行其任务(例如,在收到“开始”消息时)并将结果发回。

我想何时我应该使用前者(使用Future s)和后者(使用Actor s)方法和为什么对于上述情况,Future方法被认为更好。

3 个答案:

答案 0 :(得分:7)

因为它在语法上更简单。

val tasks: Seq[() => T] = ???
val futures = tasks map {
  t => future { t() }
}
val results: Future[Seq[T]] = Future.sequence(futures)

results未来您可以等待使用Await.result,或者您可以进一步映射/使用它进行理解或在其上安装回调。

将其与实例化所有演员,向他们发送消息,编码他们的receive块,接收来自他们的响应并关闭它们 - 这通常需要更多样板。

答案 1 :(得分:6)

作为一般规则,使用适合您的应用程序的最简单的并发模型,而不是最强大的。从最简单到最复杂的排序将是顺序编程 - >并行集合 - >期货 - >无状态参与者 - >有状态参与者 - >具有软件事务存储器的线程 - >带有显式锁定的线程 - >具有锁定的线程 - 免费算法。选择此列表中的第一个解决问题的方法。你去的列表越远,复杂性和风险就越大,所以你最好把简单性换成概念性的力量。

答案 2 :(得分:0)

我倾向于认为当你有交互线程时,actor是有用的。在您的情况下,似乎所有工作都是独立的;我会用期货。