2012-02-06 6 views
12

ho know che è possibile impostare il numero di thread da utilizzare per tutte le operazioni .par in questo modo: collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int)Come impostare il numero di thread da utilizzare per il par

ma è possibile impostare il numero di thread usare per una sola chiamata .par?

+1

Suppongo che potresti creare un pool separato per quello, ma non credo che sia supportato al momento. –

+4

Questo non funziona più in 2.10. –

+0

possibile duplicato di [scala parallelo grado di parallelismo delle collezioni] (http://stackoverflow.com/questions/5424496/scala-parallel-collections-degree-of-parallelism) –

risposta

15

Si potrebbe creare un blocco che imposta il livello di parallelismo e quindi eseguire metodi specifici all'interno di quel blocco:

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

e quindi chiamare come tale:

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

sembra che cambi alcuni stato globale ... – tuxSlayer

+0

I non mi piace il fatto che cambi lo stato globale –

13

In Scala 2.11 si dovrebbe utilizzare supporto attività di raccolta parallela, come questa:

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

parallelCollection.map(...) 

Vedere supporto attività documentation

Problemi correlati