【问题标题】:Is it possible and how to have Scala par consume threads from a thread pool?是否有可能以及如何让 Scala par 消耗线程池中的线程?
【发布时间】:2018-03-06 03:19:06
【问题描述】:

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

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
      }
    }
}

【问题讨论】:

    标签: scala concurrency threadpool thread-local


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 1970-01-01
      • 2015-07-26
      • 2021-07-20
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      相关资源
      最近更新 更多