在Scala的并行集合中,是否有类似于LINQ的 withDegreeOfParallelism
的等价功能,可以设置运行查询的线程数?我想要并行地运行一个需要固定数量线程的操作。
在Scala的并行集合中,是否有类似于LINQ的 withDegreeOfParallelism
的等价功能,可以设置运行查询的线程数?我想要并行地运行一个需要固定数量线程的操作。
使用最新的trunk版本,使用JVM 1.6或更高版本,请使用:
collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int)
这可能会在未来发生变化。计划在未来的版本中采取更统一的方式来配置所有Scala任务并行API。tasksupport
字段设置为新的TaskSupport
对象,例如以下示例:scala> import scala.collection.parallel._
import scala.collection.parallel._
scala> val pc = mutable.ParArray(1, 2, 3)
pc: scala.collection.parallel.mutable.ParArray[Int] = ParArray(1, 2, 3)
scala> pc.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(2))
pc.tasksupport: scala.collection.parallel.TaskSupport = scala.collection.parallel.ForkJoinTaskSupport@4a5d484a
scala> pc map { _ + 1 }
res0: scala.collection.parallel.mutable.ParArray[Int] = ParArray(2, 3, 4)
在使用fork join池实例化ForkJoinTaskSupport
对象时,必须将fork join池的并行度级别设置为所需值(例如示例中的2
)。
无论使用哪个JVM版本,使用Scala 2.9+(引入了并行集合)您也可以使用grouped(Int)
和par
函数的组合来在小块上执行并行任务,例如:
scala> val c = 1 to 5
c: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
scala> c.grouped(2).seq.flatMap(_.par.map(_ * 2)).toList
res11: List[Int] = List(2, 4, 6, 8, 10)
grouped(2)
函数将集合按长度为2或更小的块进行分组,seq
函数确保这些块不是并行的(在此示例中无用),然后在使用par
创建的小型并行块上执行_ * 2
函数,从而确保最多只有2个线程并行执行。
但是,这种方法可能比设置工作池参数略微低效,我对此不确定。