是否有可能以及如何让 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)
在 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)