【问题标题】:What is the benefit of using Futures over parallel collections in scala?在scala中使用Futures而不是并行集合有什么好处?
【发布时间】:2012-12-22 07:01:09
【问题描述】:

在并行处理项目列表时,Futures(与并行集合相比)增加复杂性是否有充分的理由?

List(...).par.foreach(x=>longRunningAction(x))  

Future.traverse(List(...)) (x=>Future(longRunningAction(x)))

【问题讨论】:

    标签: scala parallel-processing actor


    【解决方案1】:

    我认为主要优点是您可以在计算出每个未来的结果后立即访问它,而您必须等待整个计算通过并行集合完成。一个缺点可能是你最终会创建很多期货。如果你后来最终调用 Future.sequence,那真的没有任何优势。

    【讨论】:

    • 我认为foreach使用了问题的作者不是并行收集的很好用例。并行集合真正有用的方面是使用折叠和归约。
    • 我更广泛地解释了这个问题。我认为这只是众多可能用途中的一个例子。
    • @pedrofurla 我了解折叠和减少的并行集合的用处,但是 flatMap 和 map 呢?
    • @KimStebel IMO 使用并行集合自定义底层线程池有点困难,你不觉得吗?
    【解决方案2】:

    当我们接近处理所有项目时,并行集合将杀死一些线程。所以最后几项可能由单线程处理。 有关此行为的更多详细信息,请参阅我的问题Using ThreadPoolTaskSupport as tasksupport for parallel collections in scala

    Future 不会做这样的事情,在处理完所有对象之前,您的所有线程都在使用中。因此,除非您的任务非常小,以至于您不关心最后几个任务的并行性损失,并且您正在使用大量线程,必须尽快将其杀死,否则 Futures 会更好。

    【讨论】:

    • 这应该是评论,而不是答案。如果这是一个重复的问题,请vote to close 和/或在您earn 足够reputation 后发表评论。如果没有,为这个特定问题量身定制答案
    • @double-beep 添加了第二段来定制这个问题的答案。
    【解决方案3】:

    只要您想组合延迟/并发计算,Future 就会变得有用。 Futures(无论如何都是好的,比如 Akka 的)是一元的,因此允许您构建任意复杂的计算结构,并由 Futures 库正确处理所有并发和同步。

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 2010-09-14
      • 2022-08-03
      • 2011-05-27
      • 2012-07-16
      • 2013-11-05
      • 2012-01-26
      • 2023-03-16
      • 2020-06-05
      相关资源
      最近更新 更多