01-5. Process vs Thread 完整對比 ⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐⭐ (簡單)
🎯 本篇重點 完整對比 Process 和 Thread 的差異,理解各自的優缺點和適用場景。
🤔 一句話解釋 Process: 擁有獨立記憶體空間的執行單位 Thread: 共享記憶體空間的輕量級執行單位
🏢 用公司來比喻 Process = 獨立的公司 公司 A(Process A) ├─ 辦公室(獨立記憶體空間) ├─ 資產(獨立資源) ├─ 員工(Thread) └─ 財務(獨立帳戶) 公司 B(Process B) ├─ 辦公室(獨立記憶體空間) ├─ 資產(獨立資源) ├─ 員工(Thread) └─ 財務(獨立帳戶) 公司 A 和 B 完全獨立,互不干擾Thread = 公司內的員工 公司 A(Process) ├─ 辦公室(共享記憶體空間) │ ├─ 員工 1(Thread 1) │ ├─ 員工 2(Thread 2) │ └─ 員工 3(Thread 3) │ ├─ 共用資源 │ ├─ 會議室 │ ├─ 影印機 │ └─ 茶水間 │ └─ 所有員工共享這些資源! 📊 核心差異對比 記憶體空間 特性 Process Thread 記憶體空間 獨立 共享 Code Segment 各自獨立 共享同一份 Data Segment 各自獨立 共享 Stack 各自獨立 各自獨立 Heap 各自獨立 共享 # Process:獨立記憶體 from multiprocessing import Process global_var = 0 # 每個 Process 有自己的 global_var def process_task(): global global_var global_var += 1 print(f"Process: global_var = {global_var}") p1 = Process(target=process_task) p2 = Process(target=process_task) p1.
Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
02-1. Thread 是什麼 ⏱️ 閱讀時間: 8 分鐘 🎯 難度: ⭐ (超級簡單)
🤔 一句話解釋 Thread(執行緒/線程)是 Process 內的輕量級執行單位,共享 Process 的記憶體空間,可以並發執行不同的任務。
🏢 用公司來比喻 Process = 公司 Yoru-Karu Studio(Process) ├─ 辦公室(記憶體空間) ├─ 資源(檔案、網路) └─ 員工(Threads)Thread = 員工 Yoru-Karu Studio ├─ 員工 A(Thread 1)→ 處理訂單 ├─ 員工 B(Thread 2)→ 接聽電話 ├─ 員工 C(Thread 3)→ 更新網站 └─ 員工 D(Thread 4)→ 回覆郵件 所有員工: ✅ 共用同一個辦公室(共享記憶體) ✅ 共用同一組資源(檔案、資料庫) ✅ 可以同時工作(並發) ✅ 可以互相溝通(直接存取共享變數) 💻 Thread 的本質 Thread vs Process Process(進程) └─ 獨立記憶體空間 ├─ Thread 1 (主線程) ├─ Thread 2 ├─ Thread 3 └─ Thread 4 所有 Thread 共享這個記憶體空間!記憶體結構 Process 記憶體 ├─ Code Segment ← 所有 Thread 共享 ├─ Data Segment ← 所有 Thread 共享 ├─ Heap ← 所有 Thread 共享 └─ Stack ├─ Thread 1 Stack ← 各自獨立 ├─ Thread 2 Stack ← 各自獨立 └─ Thread 3 Stack ← 各自獨立關鍵:
02-2. Thread 的優缺點 ⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐⭐ (簡單)
🤔 一句話解釋 Thread 的優點是輕量、快速、共享記憶體;缺點是競爭條件(Race Condition)、除錯困難、受 GIL 限制(Python)。
✅ Thread 的優點 1. 創建成本低 Process vs Thread 創建成本對比:
import time from multiprocessing import Process from threading import Thread # 測試 Process start = time.time() processes = [Process(target=lambda: None) for _ in range(1000)] for p in processes: p.start() for p in processes: p.join() print(f"Process: {time.time() - start:.2f} 秒") # 測試 Thread start = time.
02-3. Thread 的生命週期 ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐ (簡單)
🤔 一句話解釋 Thread 從創建到終止會經歷:New → Runnable → Running → (Blocked) → Terminated 五個狀態。
🔄 Thread 生命週期圖 創建 Thread ↓ ┌─────────┐ │ New │ ← Thread 已創建,但未啟動 └─────────┘ ↓ start() ┌─────────┐ │Runnable │ ← 就緒狀態,等待 CPU └─────────┘ ↓ OS 調度 ┌─────────┐ │ Running │ ← 正在執行 └─────────┘ ↓ 完成 / sleep() / wait() / I/O ┌─────────┐ ┌─────────┐ │ Blocked │ ←────→ │Runnable │ └─────────┘ └─────────┘ ↓ 任務完成 ┌─────────┐ │Terminated│ ← Thread 結束 └─────────┘ 📍 狀態 1:New(新建狀態) 定義:Thread 對象已創建,但尚未呼叫 start() 方法。
02-4. Thread 同步機制 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🤔 一句話解釋 Thread 同步機制用於協調多個 Thread 的執行順序,避免 Race Condition 和資料不一致問題。
🚦 為什麼需要同步機制? 問題:Race Condition from threading import Thread balance = 1000 # 銀行帳戶餘額 def withdraw(amount): global balance # 危險操作!分三步: temp = balance # 1. 讀取 temp = temp - amount # 2. 計算 balance = temp # 3. 寫回 # 兩個 Thread 同時提款 t1 = Thread(target=withdraw, args=(500,)) t2 = Thread(target=withdraw, args=(300,)) t1.
02-5. Thread Pool 與實戰應用 ⏱️ 閱讀時間: 18 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🤔 一句話解釋 Thread Pool 是預先創建的 Thread 集合,重複使用來執行多個任務,避免頻繁創建/銷毀 Thread 的開銷。
❌ 沒有 Thread Pool 的問題 問題 1:頻繁創建/銷毀 Thread import time from threading import Thread def task(task_id): time.sleep(0.1) return f"Task {task_id} 完成" # 處理 100 個任務,每個任務創建一個 Thread start = time.time() threads = [] for i in range(100): t = Thread(target=task, args=(i,)) t.start() threads.append(t) for t in threads: t.join() print(f"時間: {time.time() - start:.