假设我使用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
这显然会使用自定义任务支持对象。
答案 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