2012-02-06 23 views
12

know,您可以設置線程數來使用,像這樣所有.PAR操作: collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int)如何設置線程數使用標準桿

但是,它可以設置線程數只用一個.par調用?

+1

我想你可以爲此創建一個單獨的池,但我認爲此刻不支持。 – 2012-02-06 14:23:16

+4

這在2.10中不起作用。 – 2013-01-08 03:13:30

+0

[scala並行集合並行度]的可能重複(http://stackoverflow.com/questions/5424496/scala-parallel-collections-degree-of-parallelism) – 2013-11-12 14:27:13

回答

15

您可以創建一個設置並行級別的塊,然後在該塊內執行的具體方法:

def withParallelism[A](n : Int)(block : => A) : A = { 
    import collection.parallel.ForkJoinTasks.defaultForkJoinPool._ 
    val defaultParLevel = getParallelism 
    setParallelism(n) 
    val ret = block 
    setParallelism(defaultParLevel) 
    ret 
} 

然後調用它是這樣:

withParallelism(2) { 
    (1 to 100).par.map(_ * 2) 
} 
+11

看起來像它改變了一些全球狀態... – tuxSlayer 2012-02-08 23:13:37

+0

I不喜歡它改變全球狀態的事實 – 2016-11-17 15:57:44

13

在斯卡拉2.11,你應該使用並行採集任務支持,如下所示:

parallelCollection.tasksupport = new ForkJoinTaskSupport(
    new scala.concurrent.forkjoin.ForkJoinPool(parlevel)) 

parallelCollection.map(...) 

查看任務支持documentation