繁体   English   中英

Scala并行集合:更改默认池

[英]Scala Parallel Collections: Change default Pool

简洁版本

当我调用集合的.par函数时,我正在寻找一种方法来设置一次性使用全局的Pool ...

到目前为止,我只发现如何设置全局ExecutionContext中的线程数,而不是如何更改默认情况下使用的实际池数。

我只是想明确指定ForkJoinPool以使并行集合ExecutionContext独立于我使用的Scala版本。


长版本由于Scala 2.10不支持JDK 1.8,因此我们遇到问题之后就出现了这个要求

Scala根本不认识java版本,并认为我们仍然在1.5,因此池是一个不同的类型,线程的数量不限于处理器的数量

问题是由此代码引起的:

if (scala.util.Properties.isJavaAtLeast("1.6")) new ForkJoinTaskSupport
    else new ThreadPoolTaskSupport

def isJavaAtLeast(version: String) = {
    val okVersions = version match {
      case "1.5"    => List("1.5", "1.6", "1.7")
      case "1.6"    => List("1.6", "1.7")
      case "1.7"    => List("1.7")
      case _        => Nil
    }
    okVersions exists (javaVersion startsWith _)
  }

正如我们如何管理线程是在我国的应用相当关键,我们不希望意想不到的惊喜只是改变一个版本,我想知道,如果有可能迫使斯卡拉使用ForkJoinPool与我们GLOBALLY决定线程的预设数量(我不我想要这里描述的单实例解决方案Scala Parallel Collections:如何知道和配置线程数

希望它足够清楚!

从我的角度来看,您的问题包含两个不同的要求:

一个是I merely want to explicitly specify the ForkJoinPool to make the parallel collections ExecutionContext independent from the Scala version I use.

我不知道这是可能的。 最重要的是,我对构造函数class ForkJoinTaskSupport(val environment: ForkJoinPool)持怀疑态度。 使用ForkJoinPool调用此构造函数,支持.par使用的当前执行上下文,如果我没有弄错的话,这是全局的。 几层之后,我们意识到这个池在ExecutionContextImpl中定义:

def createExecutorService: ExecutorService = {

    [...]

    val desiredParallelism = range(
      getInt("scala.concurrent.context.minThreads", "1"),
      getInt("scala.concurrent.context.numThreads", "x1"),
      getInt("scala.concurrent.context.maxThreads", "x1"))

    val threadFactory = new DefaultThreadFactory(daemonic = true)

    try {
      new ForkJoinPool(
        desiredParallelism,
        threadFactory,
        uncaughtExceptionHandler,
        true) // Async all the way baby
    } catch {
      [...]
    }
  }

所以它不是一个你可以改变的游泳池,但它仍然是一个你可以配置的游泳池,这将解决你的需求的重新制定, I wondered if it was possible to force Scala to use ForkJoinPool with a preset number of threads decided by us GLOBALLY

完全免责声明:我从未尝试这样做,因为到目前为止我还没需要它,但你的问题让我想调查一下!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM