如何设置用于par的线程数

dav*_*ave 15 parallel-processing scala

知道你可以设置用于所有.par操作的线程数,如下所示: collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int)

但是,是否可以设置仅用于一个.par调用的线程数?

Sub*_*oid 16

您可以创建一个设置并行度级别的块,然后在该块中执行特定方法:

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

然后将其称为:

withParallelism(2) {
  (1 to 100).par.map(_ * 2)
}
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢它改变全局状态的事实 (3认同)

cai*_*cuk 15

在Scala 2.11中,您应该使用并行收集任务支持,如下所示:

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

parallelCollection.map( ... )
Run Code Online (Sandbox Code Playgroud)

请参阅任务支持文档