執行緒(Thread)是什麼?完整解析多執行緒與進程的差異與應用

更新日期: 2025 年 2 月 13 日

什麼是執行緒(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()
  • 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 限制)。 🚀

Similar Posts