2017-06-01 52 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