并行 (Concurrency) 与并发 (Parallelism) 有什么不同?

2026年2月21日

💎 加入 E+ 成長計畫 與超過 950+ 位工程師一同在社群成長,並獲得更多深度的軟體前後端學習資源

并行 (Concurrency) 与并发 (Parallelism) 这两个词,从中文词义来理解,都是指让程序能够同时处理多项任务;然而,两者有相当不同的出发点,实际的做法也不同,是程序设计时经常会被搞混的概念。多年前,Go 语言的发明者 Rob Pike 甚至给了一个演讲来厘清这两者的区别。

因此,在面试时也很常会有相关的问题。在面试时可能不必然是直接问「并行 (Concurrency) 与 并发 (Parallelism) 有什么不同?」,而是会在给定某个情境下问可以如何解决,这时候懂得这两种不同方法,将有助于在遇到相关问题时提出适当的解法。

并行 Concurrency

要理解并行的概念,先让我们从一个生活中的例子来谈。许多厉害的厨师在做菜时,一个人可以同时做很多件事,例如把饭煮下去后,在等饭煮好的过程会先去处理肉类;然后可能一个锅子煎蛋,另一个汆烫青菜。

在这个看似同时做多件事的过程,其实这些厨师仍是「在一个当下只做一件事」,但是通过等待的空档,快速切换去做另一件事。举例来说,在汆烫青菜时要等两分钟,与其让这两分钟闲置,可以快速切换去煎蛋;蛋煎完后再去把汆烫好的菜摆到盘子上。

在程序实际执行时,单核心 (Single-core) CPU 就像上述的厨师一样。单一个 CPU 核心在同一时间只能执行一件事,但很多时候在等其他元件执行任务,例如等待磁盘读取、等待网络传输,所以在等 A 任务时,CPU 可以先切换去处理 B 任务。

这种快速切换来完成多个任务,减少 CPU 的闲置浪费,是并行 (concurrency) 的一大特色。由于快速切换,并行往往让人感觉同时在处理多个任务,但并行没有脱离 CPU 在同一个时间只能处理一个任务的事实;如果要更精确说,并行是同时「管理」多项任务。

并发 Parallelism

在理解完并行的概念后,接着让我们来谈并发的概念。同样是做菜,在一些有规模的米其林星级餐厅,主厨底下可能有许多副厨与助手,有一位专门处理前菜,另一位专门处理主食,还有一位专门处理甜点的。在这个例子中,是同时有多位厨师在执行任务。

这个概念类似于并发,并发与并行不同的关键点在于,并发会有多个实际执行的单位,例如有多个 CPU 核心同时处理任务。所以比起同时管理多个任务,并发是同时「执行」多个任务。

两者处理的限制不同

从上面两者的描述,相信读者们应该都能理解区别在哪。针对这两者的区别,我们可以进一步从限制的角度来讨论。

当今天程序跑很慢,我们可以进一步区分,是因为本身运算消耗大,CPU 用尽全力仍不够,所以导致很慢;或是 CPU 消耗不大,只是多数时间在等外部任务被完成。前者被称为 CPU 受限的任务 (CPU-bound task),后者则是 I/O 受限的任务 (IO-bound task)。

对于并行来说,特别适合用来处理 I/O 受限的任务,因为受限于 I/O 意味着 CPU 可能多数时间在等待 I/O 的结果,所以 CPU 相对可能被闲置,这时有空档可以先去处理别的任务。

而对于并发来说,则适合处理 CPU 受限的任务。因为 CPU 受限的任务代表既有的 CPU 已经满载,程序跑得慢是因为还没完成运算。这时候即使安排并行的任务,CPU 也没有闲暇的时间处理。不过通过并发,则可以多加几个 CPU 突破既有的限制。图片压缩、机器学习相关运算,都是属于这类任务,可以通过多个 CPU 的并发运算来加速。

总结

总结来说,并行是在应对「如果只有单一运算资源,每次只能处理一个任务,如何有效组织编排不同任务,让闲置更少」这个问题。另一方面,并发则是在应对「如何同时有多个运算单元来加速任务的处理」这个问题。

在开头有提到的 Go 语言发明者 Rob Pike 的演讲中,他说「并行强调的是如何安排与处理多件事情。并发强调的是同时执行多件事情。」

Concurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once

并行与并发两者并非互斥;在现代多核心处理器上,一个程序可以同时具备并行与并发的特性。如果从上述 Rob Pike 的观点来看,并行是一种将程序拆分成多个可独立运作任务的架构方式。当我们把程序设计为并行后,如果有多核心的运算资源,这些任务就能够真正地被更好地并发执行。因此,良好的并行设计,是让程序能够顺利进行并发运算的重要基础。

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們