并行执行理解

时间:2016-11-13 14:12:11

标签: scala

我写了这段代码

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值吗?

1 个答案:

答案 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值分割工作的均匀程度。