自定义Scala并行集合的任务支持?

时间:2016-09-01 05:42:25

标签: scala scala-collections

假设我使用Scala documentation中所述的自定义任务支持对象创建新的ParMap

val existingOrders = parallel.mutable.ParMap.empty[UUID, Order]
existingOrders.tasksupport = new ForkJoinTaskSupport(...)

existingOrders添加一堆订单后,我现在要将过滤器p应用于此集合的值,以提取子集,如下所示。最简单的方法是:

val filteredOrders = existingOrders.values.filter(p)

现在existingOrders.values的类型为ParIterable[Order]。我想知道existingOrders.values从何处获取控制过滤操作的调度和负载平衡的任务支持对象?是否使用我为existingOrders创建的自定义任务支持对象?它是否使用默认任务支持对象?

另一种可能的实现方式是首先执行过滤操作,然后返回值:

val filteredOrders = existingOrders.filter { case (_, order) => p(order) }
filteredOrders.values

这显然会使用自定义任务支持对象。

1 个答案:

答案 0 :(得分:0)

  

是否使用我为其创建的自定义任务支持对象   existingOrders?它是否使用默认任务支持对象?

不,它不会将您的自定义tasksupport对象转移到ParIterable[Order]it uses the default ExecutionContextTaskSupport as mentioned in the documentation。打印出existingOrders.values.tasksupport

时,您可以看到这一点
import scala.collection.parallel.ForkJoinTaskSupport
import scala.concurrent.forkjoin.ForkJoinPool

scala> val parMap = Map(1 -> 1).par
parMap: scala.collection.parallel.immutable.ParMap[Int,Int] = ParMap(1 -> 1)

scala> val taskSupport = new ForkJoinTaskSupport(new ForkJoinPool(1))
taskSupport: scala.collection.parallel.ForkJoinTaskSupport = scala.collection.parallel.ForkJoinTaskSupport@26fadd98

scala> parMap.tasksupport = taskSupport
parMap.tasksupport: scala.collection.parallel.TaskSupport = scala.collection.parallel.ForkJoinTaskSupport@26fadd98

scala> parMap.values.tasksupport
res1: scala.collection.parallel.TaskSupport = scala.collection.parallel.ExecutionContextTaskSupport@2991524