陷阱

必須按特定順序接收集合元素時,請勿使用並行集合

並行集合同時執行操作。這意味著所有工作都分成幾部分並分配給不同的處理器。每個處理器都不知道其他人正在完成的工作。如果集合順序很重要,那麼並行處理的工作是不確定的。 (兩次執行相同的程式碼會產生不同的結果。)

非關聯操作

如果操作是非關聯的(如果執行順序很重要),則並行化集合上的結果將是不確定的。

scala> val list = (1 to 1000).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10...

scala> list.reduce(_ - _)
res0: Int = -500498

scala> list.reduce(_ - _)
res1: Int = -500498

scala> list.reduce(_ - _)
res2: Int = -500498

scala> val listPar = list.par
listPar: scala.collection.parallel.immutable.ParSeq[Int] = ParVector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10...

scala> listPar.reduce(_ - _)
res3: Int = -408314

scala> listPar.reduce(_ - _)
res4: Int = -422884

scala> listPar.reduce(_ - _)
res5: Int = -301748

副作用

由於競爭條件,具有副作用的操作(例如 foreach)可能無法在並行化集合上按預期執行。通過使用沒有副作用的函式來避免這種情況,例如 reducemap

scala> val wittyOneLiner = Array("Artificial", "Intelligence", "is", "no", "match", "for", "natural", "stupidity")

scala> wittyOneLiner.foreach(word => print(word + " "))
Artificial Intelligence is no match for natural stupidity 

scala> wittyOneLiner.par.foreach(word => print(word + " "))
match natural is for Artificial no stupidity Intelligence

scala> print(wittyOneLiner.par.reduce{_ + " " + _})
Artificial Intelligence is no match for natural stupidity

scala> val list = (1 to 100).toList
list: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15...