是否有可能以及如何让Scala使用线程池中的线程?
问题描述:
在斯卡拉2.11.8我使用par
来并行化一个大而长的foreach
。我还试图优化代码以避免每次都创建对象的新实例,因此我需要使用DynamicVariable
。但是,我注意到仍然有很多这个类创建的实例,这导致我认为par
总是跨越新线程而不是重用它们。因此,OP如何使par从线程池中消耗有限的可重用线程?这可能吗?是否有可能以及如何让Scala使用线程池中的线程?
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具有默认线程池,这就是scala.concurrent.ExecutionContext.global
,该线程池由processors依赖。
所以par
不会永远产卵环新的线程。
,如果你需要创建自定义TaskSupport,你可以不喜欢它:
val pc = mutable.ParArray(1, 2, 3)
pc.tasksupport = new ForkJoinTaskSupport(
new java.util.concurrent.ForkJoinPool(2))
}}}
pc.foreach(println)