執行緒(Thread)是什麼?完整解析多執行緒與進程的差異與應用
更新日期: 2025 年 2 月 13 日
本文為 Python API 優化基礎 系列文,第 3 篇:
- 什麼是 asyncio?——Python 的非同步編程核心
- 高效能快取解決方案——深入解析 AioCache 套件
- 執行緒(Thread)是什麼?完整解析多執行緒與進程的差異與應用 👈進度
- 完整解析 ThreadPoolExecutor:Python 高效併發工具
- CPU 運算 vs. I/O 操作:執行緒與進程的最佳實踐
- ThreadPoolExecutor vs. asyncio:完整解析與實戰示例
什麼是執行緒(Thread)?
在電腦運行程式時,作業系統會將每個程式視為一個「進程(Process)」,而每個進程內部可以有一個或多個執行緒(Threads),來負責執行不同的工作。
📌 執行緒(Thread)是程式執行的最小單位
單執行緒範例
首先,假設我們有一個簡單的 Python 程式,它會依序執行兩個函式,沒有使用多執行緒:
import time
def task1():
print("🔄 任務 1 開始執行")
time.sleep(3) # 模擬 3 秒的工作時間
print("✅ 任務 1 完成")
def task2():
print("🔄 任務 2 開始執行")
time.sleep(2) # 模擬 2 秒的工作時間
print("✅ 任務 2 完成")
print("🚀 開始執行程式")
task1()
task2()
print("🎉 所有任務完成")
📌 輸出結果
🚀 開始執行程式
🔄 任務 1 開始執行
✅ 任務 1 完成
🔄 任務 2 開始執行
✅ 任務 2 完成
🎉 所有任務完成
📌 說明
- 這個程式在執行時,作業系統會建立一個進程,並在其中只執行一個執行緒(單執行緒)。
task1()
執行完後,task2()
才開始執行,兩者無法同時執行,總共需要 5 秒 完成。
使用多執行緒加速程式
我們可以改寫程式,讓 task1()
和 task2()
同時執行,來節省時間:
import threading
import time
def task1():
print("🔄 任務 1(執行緒 1)開始執行")
time.sleep(3)
print("✅ 任務 1(執行緒 1)完成")
def task2():
print("🔄 任務 2(執行緒 2)開始執行")
time.sleep(2)
print("✅ 任務 2(執行緒 2)完成")
print("🚀 開始執行程式")
# 創建兩個執行緒,並指派不同的任務
thread1 = threading.Thread(target=task1)
thread2 = threading.Thread(target=task2)
# 啟動執行緒
thread1.start()
thread2.start()
# 等待執行緒執行完畢
thread1.join()
thread2.join()
print("🎉 所有任務完成")
📌 輸出結果(執行緒會並行執行,因此順序可能不同)
🚀 開始執行程式
🔄 任務 1(執行緒 1)開始執行
🔄 任務 2(執行緒 2)開始執行
✅ 任務 2(執行緒 2)完成
✅ 任務 1(執行緒 1)完成
🎉 所有任務完成
📌 說明
- 這次,作業系統建立 一個進程,但裡面有兩個執行緒:
- 執行緒 1 執行
task1()
- 執行緒 2 執行
task2()
- 執行緒 1 執行
task1()
和task2()
同時執行,總執行時間只需 3 秒(比單執行緒快 2 秒)。
真實世界的「進程 vs. 執行緒」例子
例子 | 進程(Process) | 執行緒(Thread) |
---|---|---|
Google Chrome 瀏覽器 | 每個分頁(Tab)是獨立的進程 | 每個分頁內的 JavaScript 可能開多個執行緒(例如播放影片、載入網頁) |
VS Code(程式碼編輯器) | 開啟 VS Code 時,會產生一個主進程 | 負責語法分析、插件運行等的不同執行緒 |
Python 執行程式 | 運行 Python 腳本時,會啟動一個進程 | 使用 threading 模組可以讓 Python 同時執行多個執行緒 |
遊戲(如 GTA 5) | 遊戲本體是一個進程 | 渲染、物理計算、AI 行為 等不同的遊戲功能可能由不同的執行緒處理 |
音樂播放器(如 Spotify) | 播放器是獨立進程 | 下載音樂、播放音樂、顯示 UI 可能是不同的執行緒 |
Python 進程 vs. 執行緒(程式示範)
進程範例
使用 multiprocessing
創建多個進程:
from multiprocessing import Process
import time
def task(name):
print(f"🔄 進程 {name} 開始執行")
time.sleep(2)
print(f"✅ 進程 {name} 完成")
if __name__ == "__main__":
process1 = Process(target=task, args=("P1",))
process2 = Process(target=task, args=("P2",))
process1.start()
process2.start()
process1.join()
process2.join()
print("🎉 所有進程完成")
📌 結果
🔄 進程 P1 開始執行
🔄 進程 P2 開始執行
✅ 進程 P1 完成
✅ 進程 P2 完成
🎉 所有進程完成
📌 說明
multiprocessing.Process
會建立兩個獨立的進程,它們有自己的記憶體空間,不會互相影響。- 適合用於 CPU 密集型計算(例如影像處理、數據分析)。
執行緒範例
使用 threading
創建多個執行緒:
import threading
import time
def task(name):
print(f"🔄 執行緒 {name} 開始執行")
time.sleep(2)
print(f"✅ 執行緒 {name} 完成")
thread1 = threading.Thread(target=task, args=("T1",))
thread2 = threading.Thread(target=task, args=("T2",))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("🎉 所有執行緒完成")
📌 結果
🔄 執行緒 T1 開始執行
🔄 執行緒 T2 開始執行
✅ 執行緒 T1 完成
✅ 執行緒 T2 完成
🎉 所有執行緒完成
📌 說明
threading.Thread
會在同一個進程內啟動兩個執行緒,它們共享記憶體。- 適合用於 I/O 密集型任務(例如 API 請求、檔案讀取)。
總結
類別 | 進程(Process) | 執行緒(Thread) |
---|---|---|
定義 | 程式的執行實體 | 進程內的執行單位 |
記憶體 | 不共享記憶體 | 共享記憶體 |
建立成本 | 高(需要獨立記憶體) | 低(共用進程資源) |
適用場景 | CPU 密集型(影像處理、數據計算) | I/O 密集型(API 請求、爬蟲) |
✅ 進程適合 CPU 密集型工作(multiprocessing
)
✅ 執行緒適合 I/O 密集型工作(threading
) 🚀
執行緒與進程的關係(圖解)

🔹 圖解說明
- 進程(Process):程式執行時,作業系統會為它創建一個獨立的記憶體空間,這就是「進程」。
- 執行緒(Thread):在一個進程內部,可以有多個執行緒,它們共享相同的記憶體與資源,但可以同時執行不同的工作。
結論
✅ 執行緒是「進程內部的執行單位」,多執行緒允許程式同時執行多個任務。
✅ 執行緒比進程輕量,因為它們共享相同的記憶體空間,不需要額外的資源分配。
✅ 適合用於 I/O 密集型任務(如 API 請求、檔案讀取),但不適合 CPU 密集型計算(因為 Python 的 GIL 限制)。 🚀