后端小故事
1. 异步、并发与并行
异步(Asynchronous)
寓言:
想象你去了一家餐厅,点了一个非常复杂的菜肴。服务员告诉你,菜需要一段时间才能准备好,但是他们可以先给你上饮料或者其他小吃,等主菜做好后再送过来。
解释:
在这个例子中,餐厅的服务员并不会一直站在你面前等着主菜完成,而是让你在等待主菜的同时可以享受饮料和小吃。服务员不阻塞等待,而是通过 非阻塞方式(例如做其他事情)来节省时间。
在程序中,异步指的是当任务(如读取文件、网络请求等)开始时,程序不会停止,而是继续执行其他任务,等任务完成后再通过回调函数或者 Promise 返回结果。
并行(Parallelism)
寓言:
你去的餐厅有很多厨房,每个厨房都有一个厨师,每个厨师都负责做一道菜。你点的餐包含了多个菜,每个菜都可以由不同的厨师同时做,因此所有菜肴能够同时完成,并且你能在最短的时间内吃到所有菜。
解释:
在这个场景中,多个厨师同时工作,完全独立,互不影响,因此每道菜都在并行进行。这就是并行,它通过多个处理单元(例如多个 CPU 核心或线程)同时执行任务,从而加速整体任务的完成。
在程序中,并行指的是任务的真正同时执行,需要多个计算资源(如多核 CPU 或多台计算机)。
并发(Concurrency)
寓言:
餐厅只有一个厨房,但厨房里有多个厨师,他们轮流做不同的菜肴。虽然每次只有一个厨师在做某道菜,但通过轮流工作,看起来所有菜都在同时进行。每个厨师在做完一个菜后,接着做下一个。
解释:
在这个例子中,尽管只有一个厨房,但多个厨师轮流处理不同的任务。任务不是同时执行的,而是交替执行,使得所有菜看起来都在同一时间段内进行。这个就是并发,任务可能在同一时间段内交替执行,但并不一定在物理上同时执行。
在程序中,并发指的是多个任务的交替执行,通常通过时间切片或任务调度来实现,甚至可以在单核 CPU 上完成。