我写了这段代码
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的值对于d的不同线程会发生什么。如果一个线程提前完成?它会改变其他人的a,b,c值吗?
答案 0 :(得分: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并行,具体取决于为/ b / c值分割工作的均匀程度。