问题 Scala并行集合上的哪些操作是并行化的?


好像在我调用的时候 map 在并行列表中,操作并行运行,但是当我这样做时 filter 在该列表中,操作严格按顺序运行。所以要做 filter 并行,我首先映射到(A,布尔),然后过滤那些元组,并再次映射所有元组。感觉不太方便。

所以我感兴趣 - 并行集合上的哪些操作是并行化的,哪些不是?


11941
2017-10-05 15:37


起源

通用并行集合框架 - agilesteel


答案:


没有并行列表。调用 par 在...上 List 转换 List 进入默认的并行不可变序列 - a ParVector。该转换顺序进行。这俩 filter 和 map 应该是平行的。

scala> import scala.collection._
import scala.collection._

scala> List(1, 2, 3).par.filter { x => println(Thread.currentThread); x > 0 }
Thread[ForkJoinPool-1-worker-5,5,main]
Thread[ForkJoinPool-1-worker-3,5,main]
Thread[ForkJoinPool-1-worker-0,5,main]
res0: scala.collection.parallel.immutable.ParSeq[Int] = ParVector(1, 2, 3)

也许你已经得出结论了 filter 是不平行的,因为你已经测量了转换时间和 filter 时间。

目前有些操作未并行化: sort* 变种, indexOfSlice


11
2017-10-05 16:03