2012-02-06 4 views
12

Я know, что вы можете установить количество потоков, используемых для всех .PAR операций, как так: collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int)Как установить количество потоков, используемых для пар

Но можно установить число потоков использовать только для одного вызова .par?

+1

Предположим, вы можете создать для этого отдельный пул, но я не думаю, что это поддерживается в настоящий момент. –

+4

Это больше не работает в 2.10. –

+0

Возможный дубликат [параллельной коллекции параллелизма параллелизма] (http://stackoverflow.com/questions/5424496/scala-parallel-collections-degree-of-parallelism) –

ответ

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

+0

I не нравится тот факт, что он изменяет глобальное состояние –

13

В Scala 2.11 следует использовать параллельная сборка задач, таких как:

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

parallelCollection.map(...) 

См. поддержку задач documentation

Смежные вопросы