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