【发布时间】:2012-12-22 07:01:09
【问题描述】:
在并行处理项目列表时,Futures(与并行集合相比)增加复杂性是否有充分的理由?
List(...).par.foreach(x=>longRunningAction(x))
对
Future.traverse(List(...)) (x=>Future(longRunningAction(x)))
【问题讨论】:
标签: scala parallel-processing actor
在并行处理项目列表时,Futures(与并行集合相比)增加复杂性是否有充分的理由?
List(...).par.foreach(x=>longRunningAction(x))
对
Future.traverse(List(...)) (x=>Future(longRunningAction(x)))
【问题讨论】:
标签: scala parallel-processing actor
我认为主要优点是您可以在计算出每个未来的结果后立即访问它,而您必须等待整个计算通过并行集合完成。一个缺点可能是你最终会创建很多期货。如果你后来最终调用 Future.sequence,那真的没有任何优势。
【讨论】:
foreach使用了问题的作者不是并行收集的很好用例。并行集合真正有用的方面是使用折叠和归约。
当我们接近处理所有项目时,并行集合将杀死一些线程。所以最后几项可能由单线程处理。 有关此行为的更多详细信息,请参阅我的问题Using ThreadPoolTaskSupport as tasksupport for parallel collections in scala
Future 不会做这样的事情,在处理完所有对象之前,您的所有线程都在使用中。因此,除非您的任务非常小,以至于您不关心最后几个任务的并行性损失,并且您正在使用大量线程,必须尽快将其杀死,否则 Futures 会更好。
【讨论】:
只要您想组合延迟/并发计算,Future 就会变得有用。 Futures(无论如何都是好的,比如 Akka 的)是一元的,因此允许您构建任意复杂的计算结构,并由 Futures 库正确处理所有并发和同步。
【讨论】: