是否有可能以及如何让 Scala par 使用线程池中的线程?

Is it possible and how to have Scala par consume threads from a thread pool?

在 Scala 2.11.8 中,我使用 par 来并行化一个又大又长的 foreach。我也在尝试优化代码以避免每次都创建对象的新实例,因此我需要使用 DynamicVariable。但是,我注意到仍然有许多 class 创建的实例,这让我认为 par 总是跨越新线程而不是重用它们。因此,OP 如何让 par 从有限的可重用线程池中消耗线程?这可能吗?

for (k <- 0 until 5) {
    // avoid creating instances of PearsonsIncCorr
    val inc = new DynamicVariable[PearsonsIncCorr](new PearsonsIncCorr)
    elems.par foreach { pair => // <======= Here I'd like par to consume from a Thread pool 
      inc.withValue(new PearsonsIncCorr) {
        inc.reset(...)
        // compute incremental correlation
      }
    }
}

par has the default thread pool, that's the scala.concurrent.ExecutionContext.global, this thread pool is depended by the processors.

因此 par 不会总是 spawn 新线程 loop

如果您需要创建自定义 TaskSupport,您可以这样做:

   val pc = mutable.ParArray(1, 2, 3)
   pc.tasksupport = new ForkJoinTaskSupport(
      new java.util.concurrent.ForkJoinPool(2))
   }}}
   pc.foreach(println)