Scala为了充分使用多核CPU,提供了并行集合实现(有别于前面的串行集合),用于多核环境的并行计算。par
主要算法有:
- Divide and Conquer: 分治算法,Scala 通过splitters(分解器) combiners(组合器)等抽象层来实现,有点类似hadoop的MapReduce,主要思想是将计算工作分解为很多任务,分发给不同处理器处理,然后将返回结果收集。
- Work Stealin 算法 学数学,主要用于负责任务调度负载均衡Load-Balancing ,通俗点说就是自己完成自己任务后发现还有别人活没干完,主动或者被安排帮他人一起干,达到最快速完成任务的目的。
案例
import scala.collection.Parallelizable
object aiguigu {
def main(args: Array[String]): Unit = {
(1 to 5).foreach(print) // 挨个打印数据 1 2 3 4 5
println()
(1 to 5).par.foreach(print) // 会打印出随机的数字结果 比如
println()
val result1 = (0 to 100).map{case _ => Thread.currentThread().getName}.distinct
val result2 = (0 to 100).par.map{case _ => Thread.currentThread().getName}.distinct
println(result1)
println("="*25)
println(result2)
}
}
结果如下:
12345
42531
Vector(main)
=========================
ParVector(ForkJoinPool-1-worker-5, ForkJoinPool-1-worker-1, ForkJoinPool-1-worker-3, ForkJoinPool-1-worker-7)