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

Customizing task support for Scala parallel 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 创建的自定义任务支持对象?它是否使用默认任务支持对象?

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

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

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

Does is use the custom task support object that I created for existingOrders? Does it use the default task support object?

不,它不会将您的自定义 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