並行 (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 上追蹤我們