在并行处理项目列表时,是否有充分理由增加Futures(vs parallel collection)的复杂性?
List(...).par.foreach(x=>longRunningAction(x))
VS
Future.traverse(List(...)) (x=>Future(longRunningAction(x)))
答案 0 :(得分:7)
我认为主要优点是你可以在计算后立即访问每个未来的结果,而你必须等待整个计算用并行集合完成。缺点可能是你最终创造了很多未来。如果你以后最终调用Future.sequence,那么确实没有优势。
答案 1 :(得分:1)
只要您想要构建延迟/并发计算,期货就会变得有用。期货(好的,无论如何,如Akka的)是monadic,因此允许你构建任意复杂的计算结构,所有的并发和同步由Futures库正确处理。
答案 2 :(得分:1)
当我们接近处理所有项目时,并行集合将杀死某些线程。因此,最后几个项目可能由单线程处理。 请参阅我的问题以获取有关此行为Using ThreadPoolTaskSupport as tasksupport for parallel collections in scala
的更多详细信息Future不会做任何事情,并且所有线程都在使用中,直到处理完所有对象为止。因此,除非您的任务如此之小,以至于您不关心最后几个任务的并行性损失,并且您正在使用大量的线程,这些线程必须尽快终止,否则Futures会更好。