Scala 2.9并行集合如何在幕后工作?

Ste*_*fen 28 parallel-processing scala scala-collections

Scala 2.9引入了并行集合.对于某些任务来说,它们是非常棒的工具.但是,它们如何在内部工作,我是否能够影响行为/配置?

他们使用什么方法来确定最佳线程数?如果我对结果不满意,是否有任何配置参数需要调整?

我不仅对实际创建了多少线程感兴趣,我还对实际工作如何在它们之间分配感兴趣.如何收集结果以及幕后有多少魔法.Scala是否会以某种方式测试集合是否足够大以便从并行处理中受益?

oxb*_*kes 29

简而言之,您的操作如何并行化有两个正交的方面:

  1. 您的集合被拆分为块的程度(即块的大小),用于可并行化的操作(例如mapfilter)
  2. 用于基础fork-join池的线程数(执行并行任务的线程)

对于#2,这由池本身管理,它在运行时发现"理想"的并行级别(请参阅参考资料java.lang.Runtime.getRuntime.availableProcessors)

对于#1,这是一个单独的问题,scala parallel collections API通过工作窃取(自适应调度)的概念来实现这一点.也就是说,当完成特定的工作时,工人将试图从其他工作队列中窃取工作.如果没有,这表明所有处理器都非常繁忙,因此应该采取更大的工作量.

实施该图书馆的Aleksandar Prokopec在今年的ScalaDays上发表了演讲,该演讲将很快在线.他还在ScalaDays2010上进行精彩的演讲,详细描述了操作是如何拆分和重新连接的(有很多问题不是很明显,而且还有一些可爱的问题!).

PDF中提供了一个更全面的答案,描述了并行集合API.