【问题标题】:Are Scala parallel collections better in some ways than the parallel collections already available in Java?Scala 并行集合在某些方面是否比 Java 中已有的并行集合更好?
【发布时间】:2011-09-06 10:57:49
【问题描述】:

我最近一直在学习各种 Java 并发库,例如 ConcurrentHashMap 和来自 Cliff Click 的可爱的非阻塞库

我对 Scala 了解不多,但我听说过有关最近的并行集合库的好消息。

我想知道这个库与基于 Java 的库相比有哪些主要优势?

【问题讨论】:

  • 感谢大家对链接的回答和编辑!

标签: java scala collections concurrency parallel-processing


【解决方案1】:

除了 Rex Kerr 上面关于并发和并行集合服务于两个不同目的的回答之外,我还要补充一点,Java 实际上在额外的 JSR 166 包中有一个 parallel array implementation 由 Doug Lea 编写——这个集合允许在数组元素,同时不适合在没有显式同步的情况下进行并发访问。这里的一大区别是 Scala 并行集合对其他集合也有并行实现,而不仅仅是数组。它们是:

  • ParVector
  • ParRange
  • mutable.ParHashMap
  • mutable.ParHashSet
  • immutable.ParHashMap
  • immutable.ParHashSet

这些集合的所有顺序变体都可以直接转换为它们的并行对应物(方法par)。其他顺序集合可以在相对于集合大小的线性时间内转换为上述一些集合。

一些额外的数据结构正在为未来的版本提供,包括一些并行集合,它们也将允许并发访问。

【讨论】:

  • 如果你能提到 Java 并行数组实现是什么就好了。
  • 并行数组本身的链接是gee.cs.oswego.edu/dl/jsr166/dist/extra166ydocs,这可能足以让人们相信你想用 Scala 方式而不是 Java 方式来实现它。
  • 我要补充一点,这里的魔力比最初出现的还要多。如果您有一个迭代 Range 的 for/yield 并将其转换为并行 Range - 并且您在 yield 中使用不可变数据结构 - 您立即拥有一个并行循环。真是太棒了。
【解决方案2】:

稍微扩展 Rex 的回答:Java 风格的并发 modifiable 集合在 Scala 中不是很有趣的原因是它对不可变数据的偏见:在 Scala 中实现并发的最常见方法是Actor 模型(依赖于不可变数据),而不是线程。

【讨论】:

  • 我不太同意——我一直使用 Java 集合,即使是演员;我试图最小化必须以这种方式访问​​的共享状态的数量,但是如果一个进程需要全局同步,那么使用同步集合比只跟踪全局的整个额外参与者更容易且开销更低状态。
  • 我并不是说同步集合在 Scala 中不方便,但我认为它们在并发编程中并没有像在 Java 中那样发挥核心作用,Java 中唯一的其他内置选择有就是自己同步你的代码。
  • 我同意它们不是中心;我只是觉得他们仍然很有趣。如果它们消失了,我会非常想念它们,但只有一小部分代码会受到影响。
【解决方案3】:

这两个集合用于不同的用途。

Java 的并发集合允许您在并行上下文中使用它们:许多线程可以同时访问它们,并且集合肯定会做正确的事情(因此调用者不必担心锁等问题)。

相比之下,Scala 的并行集合旨在对其自身运行高阶操作,而无需担心创建线程。所以你可以这样写:

myData.par.filter(_.expensiveTest()).map(_.expensiveComputation())

过滤器和映射将各自并行执行(但过滤器将在映射开始之前完成)。

【讨论】:

  • 我能否得出结论,Scala 集合库更像是 Groovy 的 GPars 之类的并行化 DSL,而不是一个集合 API?
  • @barrymac - 不,你无法得出这样的结论。它是一个完整的库,包含您期望从函数式语言中获得的所有典型折叠、映射和过滤器。平行馆藏只是图书馆的一部分;它们尽可能并行运行,但完全透明。没有“DSL”,因为大多数操作的语法与任何其他集合的语法完全相同(例如,您可以映射到超类(例如GenSeq)而不知道或关心映射是否连续发生或并行。
  • 好东西。这是我听到的关于更多地进入 scala 的最引人注目的事情之一!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2011-12-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多