Scala程序设计之串行和并行

1、串行和并行的概念

程序的串行(Sequential)和并行(Parallel)是指程序中任务执行的方式。

串行指的是任务按照顺序一个接一个地执行,前一个任务完成后才会执行下一个任务。这种方式下,每个任务都要等待前一个任务完成才能开始执行,因此任务的执行时间是累加的。

并行指的是多个任务同时进行执行。多个任务可以在不同的处理器核心、线程或计算节点上并发执行,彼此之间相互独立,不会相互阻塞。这种方式下,多个任务可以并行执行,从而提高整体的执行效率。

串行和并行的选择通常取决于任务的特性和对执行时间的需求。

下面是一个示例来说明串行和并行的区别:

假设有三个任务 A、B 和 C,它们分别需要执行 2 秒、3 秒和 4 秒。

串行执行的情况下,按照顺序完成任务 A、B 和 C,总共需要的时间为 2 秒 + 3 秒 + 4 秒 = 9 秒。

并行执行的情况下,只需要将任务 A、B 和 C 同时进行执行,总共需要的时间为最长任务的执行时间,即 4 秒。

可以看到,在这个例子中,并行执行比串行执行更高效。

需要注意的是,并行执行可能存在资源竞争、同步问题等需要额外处理的挑战。因此,在选择串行还是并行执行时,需要综合考虑任务的特点、系统资源和需求,并评估各种因素来做出合适的决策。

2、串行和并行程序设计

package test.scala

object ParTest1 {

  

  def main(args: Array[String]): Unit = {
    println("*" * 100)
    // 串行
    for (i <- Range(0, 10)){
      println("串行", i)
    }

    println("#" * 100)
    // 并行
    scala.collection.parallel.immutable.ParRange(0, 10, 1, false).foreach(i => {
      println("并行", i)
    })

  }
}

控制台打印输出:

****************************************************************************************************
(串行,0)
(串行,1)
(串行,2)
(串行,3)
(串行,4)
(串行,5)
(串行,6)
(串行,7)
(串行,8)
(串行,9)
####################################################################################################
(并行,0)
(并行,1)
(并行,8)
(并行,5)
(并行,3)
(并行,4)
(并行,6)
(并行,9)
(并行,2)
(并行,7)

可以看出来并行是无序的。
再验证一下,并行是否可以同时执行

package test.scala

import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

object ParTest1 {

  def getCurrentTime() : String = {
    // 获取当前时间
    val currentTime = LocalDateTime.now()
    // 定义时间格式
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
    // 格式化并打印当前时间
    currentTime.format(formatter)
  }

  def serRunTest() : Unit = {
    // 串行
    for (i <- Range(0, 10)) {
      Thread.sleep(1000)
      println("串行", i, getCurrentTime())
    }
  }


  def parRunTest(): Unit = {
    // 并行
    scala.collection.parallel.immutable.ParRange(0, 10, 1, false).foreach(i => {
      Thread.sleep(1000)
      println("并行", i, getCurrentTime())
    })
  }

  def main(args: Array[String]): Unit = {
    println("*" * 100)
    serRunTest()
    println("#" * 100)
    parRunTest()
  }
}

控制台运行输出:

****************************************************************************************************
(串行,0,2023-07-16 22:05:28)
(串行,1,2023-07-16 22:05:29)
(串行,2,2023-07-16 22:05:30)
(串行,3,2023-07-16 22:05:31)
(串行,4,2023-07-16 22:05:32)
(串行,5,2023-07-16 22:05:33)
(串行,6,2023-07-16 22:05:34)
(串行,7,2023-07-16 22:05:35)
(串行,8,2023-07-16 22:05:36)
(串行,9,2023-07-16 22:05:37)
####################################################################################################
(并行,4,2023-07-16 22:05:39)
(并行,1,2023-07-16 22:05:39)
(并行,5,2023-07-16 22:05:39)
(并行,2,2023-07-16 22:05:39)
(并行,9,2023-07-16 22:05:39)
(并行,3,2023-07-16 22:05:39)
(并行,8,2023-07-16 22:05:39)
(并行,7,2023-07-16 22:05:39)
(并行,0,2023-07-16 22:05:39)
(并行,6,2023-07-16 22:05:39)

可以看出串行是一个一个执行,并行是可以同时执行的。

你可能感兴趣的:(Scala,scala,开发语言,后端)