Day 1: Concurrency還是Parallelism?別再傻傻分不清楚!

前言

安安,在接下來的 30 天,我將會與大家一起深入探索 Golang 併發 (Concurrency) 核心——Goroutine。這不僅是我的學習筆記,也希望透過這個系列文章,幫助更多像我一樣的開發者,掌握 Golang 最強大的武器之一。

作為系列的第一天,我們不急著寫程式碼。相反地,我們要先釐清兩個在併發程式設計中,最重要也最容易被搞混的概念:並行 (Concurrency)平行 (Parallelism)。搞懂它們的區別,是理解 Goroutine 設計哲學的第一把鑰匙。

一個故事:咖啡店的經營之道

想像一下,你開了一家生意興隆的咖啡店。

情境一:只有一位咖啡師 (你)

尖峰時刻,來了三位客人,分別點了美式、拿鐵和手沖。

你雖然只有一個人,但你不會傻傻地做完美式的「所有步驟」後,才開始做拿鐵。你會:

  1. 先幫美式咖啡機按下萃取濃縮的按鈕。
  2. 在機器運作的等待時間,你去幫拿鐵客人打奶泡。
  3. 奶泡打到一半,你聽到手沖客人的水滾了,於是先去沖水。
  4. 接著,你回來把打好的奶泡和濃縮混合,完成拿鐵。
  5. 最後,美式咖啡也好了,你把它交給客人。

看到了嗎?在這段時間裡,你一個人同時處理 (Dealing with) 了三杯咖啡的訂單。你不斷在各個任務之間切換,利用等待時間去處理其他事情。這就是 並行 (Concurrency)

並行 (Concurrency):指的是一種程式的結構,能夠在同一時間內處理多件事情。它不代表這些事情在物理時間上是同時執行的。核心在於任務的切換與管理

情境二:你請了兩位夥伴,共有三位咖啡師

現在,同樣來了三位客人。情況完全不同了:

  1. 你負責美式咖啡。
  2. 夥伴 A 負責拿鐵。
  3. 夥伴 B 負責手沖。

你們三個人,在同一個時間點各自獨立地製作自己的咖啡。三杯咖啡是真正在物理時間上同時被製作的。這就是 平行 (Parallelism)

平行 (Parallelism):指的是在同一時間點,同時執行 (Doing) 多件事情。它需要多個執行單元(例如多核心 CPU)的硬體支援。

從咖啡店到電腦世界

現在,讓我們把場景換回電腦:

  • 咖啡師 -> CPU 核心 (Core)
  • 咖啡訂單 -> 任務 (Task / Thread / Goroutine)
特性並行 (Concurrency)平行 (Parallelism)
核心概念處理 (Dealing with) 多個任務執行 (Doing) 多個任務
本質程式結構上的設計,邏輯上管理多任務硬體執行上的狀態,物理上同時執行
硬體需求單核心 CPU 即可達成 (透過快速切換任務)必須是多核心 CPU
關係平行必定是並行,但並行不一定是平行

簡單總結一句話:並行是關於結構,平行是關於執行。

Golang 的角色:天生就是併發的料

現在最重要的問題來了:這跟 Golang 有什麼關係?

Golang 的設計哲學就是讓並行程式設計變得極其簡單。你,身為開發者,只需要:

  1. 用並行的思維去設計你的程式:就像那位聰明的咖啡師,把大任務拆解成可以獨立運作的小任務。在 Golang 中,這些小任務就是 Goroutine
  2. 把任務丟出去:使用 go 關鍵字,你就能輕鬆地啟動一個 Goroutine,而不需要去煩惱複雜的執行緒管理。

接下來,Golang 的 Runtime 會扮演超級經理人的角色。它會看你有多少個 CPU 核心(咖啡師),然後高效地把這些 Goroutine(咖啡訂單)分配給可用的 CPU 核心去執行。

  • 如果你只有一個 CPU 核心,調度器會像第一位咖啡師一樣,在 Goroutine 之間快速切換,實現並行
  • 如果你有多個 CPU 核心,調度器就會像三位咖啡師一樣,把不同的 Goroutine 分配到不同的核心上,實現真正的平行

這就是 Golang 強大的地方:你只管用簡單的方式寫出並行的程式碼,Golang 會盡力為你在硬體上實現平行執行。

今日總結

今天我們沒有寫任何程式碼,但我們建立了整個系列最重要的心智模型:

  • 並行 (Concurrency) 是一種程式架構,讓你能夠同時處理多個任務。
  • 平行 (Parallelism) 是一種執行狀態,讓多個任務在同一時刻被執行。
  • Golang 透過 Goroutine 讓我們能輕易地撰寫並行程式,其內建的調度器則會在多核心硬體上將其轉化為平行執行。

理解了這個基礎,明天我們就能更有信心地開始我們的第一行 go 程式碼,親手啟動一個 Goroutine,感受併發的魅力!

敬請期待 Day 2: 【Hello, Goroutine!】用一行go關鍵字,開啟並行的奇幻旅程