并行度的平行集合度

在LINQ的withDegreeOfParallelism有没有等价的scala并行集合,它设置了将运行查询的线程的数量? 我想并行运行一个需要有一定数量的线程运行的操作。

使用最新的主干,使用JVM 1.6或更新版本,使用:

 collection.parallel.ForkJoinTasks.defaultForkJoinPool.setParallelism(parlevel: Int) 

不过,这可能是未来变化的一个话题。 计划在下一个版本中采用更统一的方法来configuration所有Scala任务并行API。

但是请注意,虽然这将确定查询使用的处理器数量,但这可能不是运行查询所涉及的实际线程数。 由于并行集合支持嵌套并行,如果检测到这种情况,实际的线程池实现可能会分配更多的线程来运行查询。

编辑:

从Scala 2.10开始,设置并行性级别的首选方法是将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连接池实例化ForkJoinTaskSupport对象时,必须将fork连接池的并行级别设置为所需值(示例中为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)创build长度为2或更小的块, seq确保块的集合不平行(在本例中是无用的),然后在小块平行块(用par创build)上执行_ * 2函数,从而确保最多2个线程并行执行。

这可能会比设置工作池参数的效率略低,我不确定。