並行

2016-11-13 13 views
1

執行的理解我寫了這個代碼並行

def getParallelList[T](list : List[T]) : ParSeq[T] = { 
    val parList = list.par 
    parList.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(10)) 
    parList 
} 

for { 
    a <- getList1 
    b <- getList2 
    c = b.calculateSomething 
    d <- getParallelList(getList3) 
} { ... } 

我想知道這是否是一個很好的(或最佳)的方式,使並行for循環執行呢?或者我應該在循環中的期貨中明確地編碼。

我測試了這個,它似乎工作......但我不知道這是否是最好的方法......我也擔心a,b,c的值會發生什麼變化。如果一個線程更早完成?它是否改變了a,b,c對他人的價值?

+0

我應該在d的切片上並行執行for循環,每個切片使用相同的a,b,c。只要a,b,c是不變的(即它們的值在任何情況下都不應該改變),就沒有問題。 – JulienD

回答

3

如果getList3是引用透明的,即它每次調用時都會返回相同的值,最好計算一次,因爲調用列表中的.par必須將它變成一個ParVector,它需要O (n)(因爲List是鏈接列表,不能立即轉換爲Vector結構)。下面是例如:

val list3 = getParallelList(getList3) 
for { 
    a <- getList1 
    b <- getList2 
    c = b.calculateSomething 
    d <- list3 
} { ... } 

在爲理解,對於值(A,B,C)將保持d值的處理過程中是相同的。

爲了獲得最佳性能,您可以考慮使getList1或getList2平行,具體取決於對a/b/c值分割工作的平均程度。