程序的串行(Sequential)和并行(Parallel)是指程序中任务执行的方式。
串行指的是任务按照顺序一个接一个地执行,前一个任务完成后才会执行下一个任务。这种方式下,每个任务都要等待前一个任务完成才能开始执行,因此任务的执行时间是累加的。
并行指的是多个任务同时进行执行。多个任务可以在不同的处理器核心、线程或计算节点上并发执行,彼此之间相互独立,不会相互阻塞。这种方式下,多个任务可以并行执行,从而提高整体的执行效率。
串行和并行的选择通常取决于任务的特性和对执行时间的需求。
下面是一个示例来说明串行和并行的区别:
假设有三个任务 A、B 和 C,它们分别需要执行 2 秒、3 秒和 4 秒。
串行执行的情况下,按照顺序完成任务 A、B 和 C,总共需要的时间为 2 秒 + 3 秒 + 4 秒 = 9 秒。
并行执行的情况下,只需要将任务 A、B 和 C 同时进行执行,总共需要的时间为最长任务的执行时间,即 4 秒。
可以看到,在这个例子中,并行执行比串行执行更高效。
需要注意的是,并行执行可能存在资源竞争、同步问题等需要额外处理的挑战。因此,在选择串行还是并行执行时,需要综合考虑任务的特点、系统资源和需求,并评估各种因素来做出合适的决策。
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)
可以看出串行是一个一个执行,并行是可以同时执行的。