2017-06-01 49 views
2

短版斯卡拉并行类别:更改默认池

我正在寻找一种方法来设置一劳永逸,当我打电话集合的.PAR功能是什么游泳池在全球范围内使用...

到目前为止,我只找到了如何设置全局ExecutionContext中的线程数量,而不是如何更改默认使用的实际Pool。

我只是想明确指定ForkJoinPool使并行集合ExecutionContext与我使用的Scala版本无关。


长版 这一要求进来后我们有问题,因为Scala 2.10不支持JDK 1.8

斯卡拉根本不认识的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 _) 
    } 

由于我们如何管理线程在我们的应用程序中非常关键,我们不希望仅仅更改版本就意想不到的惊喜,我想知道是否可以强制Scala使用带有预定数量的线程的ForkJoinPool GLOBALLY(我不希望单实例解决方案在这里描述Scala Parallel Collections: How to know and configure the number of threads

希望它足够清楚!

+0

“Scala 2.10不支持JDK 1.8” - 呃?它不? (你想2.9?) –

+0

也有你见过https://stackoverflow.com/questions/17865823/how-do-i-set-the-default-number-of-threads-for-scala-2-10 -parallel的集合? –

+0

看起来好像没有很好的解决方案,所以我建议一个更好的方法,只有当你很少调用'par'时,你才可以轻松地跟踪和修改:为可并行化的集合添加你自己的隐式包装类,并添加'customPar'方法将调用'par'并分配一些可以配置的固定'tasksupport'对象。 – SergGr

回答

0

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

一个是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

完全免责声明:我从来没有尝试过这样做,因为我没有必要这么远,但你的问题让我想查了一下!

+0

是的,我看到可以通过系统属性配置并行性,所以线程数量在我的应用程序中受到控制。 这些属性默认使用ForkJoinPool中的处理器数量,这很好。 但是我的主要问题仍然是我提到的代码它决定这是默认池使用,因为它看起来它不可能覆盖它 – gmconte

+0

你能告诉你怎么样建立的UncaughtExceptionHandler的? – dirceusemighini

+0

它实际上从代码库阶提取:https://github.com/scala/scala/blob/v2.11.11/src/library/scala/concurrent/impl/ExecutionContextImpl.scala – C4stor