Scala:如何并行使用自定义函数

时间:2014-07-15 07:06:27

标签: function scala parallel-processing

这应该是一个快速的:)

假设我有这样的功能:

    def sort: List[Int] => List[Int]

我想在一个名为sortPar的函数中并行化它。最初我以为我需要这样做:

    def sortPar: List[Int] => List[Int] = ls => sort(ls.par).toList

但当然这是不可能的,因为sort需要列表而不是ParSeq。经过一段时间的努力,我想出了这个解决方案,但我不太确定:

    def sortPar: List[Int] => List[Int] = ls => sort(ls).par.toList

这会在运行时方面实现吗?我在eclipse中没有红十字架,所以我认为它应该可以工作,但我不知道它是否真的并行排列。

非常感谢 柯蒂斯

1 个答案:

答案 0 :(得分:1)

def sortPar: List[Int] => List[Int] = ls => sort(ls).par.toList并不执行任何操作,因为您首先调用sort(ls),它会按顺序对列表进行排序。

之后的调用是无用的,因为您将结果转换为并行集合并直接将其转换回序列List

您可以/应该考虑的事项:

关于您的第一个问题,有针对此类情况设计的特征,例如GenMapGenSet或您的情况GenSeq可能是最接近的问题,因为{{1} }是List

所以你可以写这样的排序函数:

Seq

并使用线性或平行def sort(seq: scala.collection.GenSeq[Int]) = ...

Seq

因此,如果使用sort(List(1,2,3)) sort(List(1,2,3).par) 可用的函数实现sort,则传递顺序Seq将使用顺序实现,并且传递GenSeq可能会并行运行这些函数。 (某些功能仍按顺序运行,如ParSeq

如果您不使用具有并行实现的函数,那么您必须自己处理并行化。我个人没有经验。您可以查看源代码中的一些实现。

https://github.com/scala/scala/blob/2.12.x/src/library/scala/collection/parallel/ParIterableLike.scala