假设我需要运行一些并发任务。
我可以将每个任务包装在Future
中并等待它们完成。或者,我可以为每个任务创建Actor
。每个Actor
将执行其任务(例如,在收到“开始”消息时)并将结果发回。
我想何时我应该使用前者(使用Future
s)和后者(使用Actor
s)方法和为什么对于上述情况,Future
方法被认为更好。
答案 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是有用的。在您的情况下,似乎所有工作都是独立的;我会用期货。