自定义 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
假设我使用 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