Scala 2.9引入了并行集合。它们对于某些任务来说是一个非常好的工具。但是,它们如何在内部工作,我能够影响行为/配置吗?
他们使用什么方法来确定最佳线程数?如果我对结果不满意,是否有任何配置参数需要调整?
我不仅对实际创建了多少线程感兴趣,我还对实际工作如何在其中分配的方式感兴趣。如何收集结果以及幕后有多少魔法。 Scala是否会以某种方式测试集合是否足以从并行处理中受益?
答案 0 :(得分:29)
简而言之,您的操作如何并行化有两个正交的方面:
map
或filter
)对于#2,它由池本身管理,它在运行时发现“理想”的并行级别(参见java.lang.Runtime.getRuntime.availableProcessors
)
对于#1,这是一个单独的问题,scala parallel collections API通过工作窃取(自适应调度)的概念来实现这一点。也就是说,当完成特定的工作时,工人将试图从其他工作队列中窃取工作。如果没有,这表明所有处理器都非常繁忙,因此应该采取更大的工作量。
实施图书馆的亚历山大·普罗科佩克(Aleksandar Prokopec)在今年的ScalaDays上发表了演讲,该演讲将很快上线。他还给了a great talk at ScalaDays2010,详细描述了操作是如何拆分和重新连接的(有很多问题不是很明显,而且还有一些可爱的问题!)。
PDF describing the parallel collections API中提供了更全面的答案。