11
好像當我在並行列表上調用map
時,該操作並行運行,但是當我在該列表上執行filter
時,操作嚴格按順序運行。因此,爲了使filter
平行,我首先映射到(A,布爾),然後過濾這些元組,然後再映射回來。感覺不是很方便。Scala並行集合上的哪些操作是並行化的?
所以我很感興趣 - 並行集合上的哪些操作是並行的,哪些不是?
好像當我在並行列表上調用map
時,該操作並行運行,但是當我在該列表上執行filter
時,操作嚴格按順序運行。因此,爲了使filter
平行,我首先映射到(A,布爾),然後過濾這些元組,然後再映射回來。感覺不是很方便。Scala並行集合上的哪些操作是並行化的?
所以我很感興趣 - 並行集合上的哪些操作是並行的,哪些不是?
沒有平行列表。在List
上調用par
可將List
轉換爲默認的並行不可變序列 - 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
。
[通用並行集合框架](http://infoscience.epfl.ch/record/150220/files/pc.pdf) – agilesteel