Yoru Karu Studio

程式設計學習筆記 | 生活心得

03-5. Socket 通訊 ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等) 🎯 本篇重點 掌握 Socket 這種最靈活的 IPC 方式,學習如何使用 TCP/UDP 進行 Process 間通訊,甚至跨網路通訊。 🤔 什麼是 Socket? Socket(套接字) = 網路通訊的端點 一句話解釋: Socket 是一種通訊介面,讓 Process 能夠透過網路協定(TCP/UDP)互相傳遞資料,可用於本機或跨機器通訊。 🏢 用通訊方式比喻 Pipe/Queue = 內線電話 同一棟大樓內的兩個辦公室 ├─ 辦公室 A ──→ 內線 ──→ 辦公室 B └─ 只能在同一棟樓使用Socket = 手機/網路電話 不同地點的辦公室 ├─ 台北辦公室 ──→ 網路 ──→ 高雄辦公室 ├─ 可以跨城市、跨國家 └─ 使用標準化協定(TCP/UDP) 💻 Socket 基礎概念 TCP vs UDP 特性 TCP UDP 連線方式 面向連線 無連線 可靠性 可靠(保證送達) 不可靠(可能遺失) 速度 較慢 較快 順序 保證順序 不保證順序 適用場景 HTTP、檔案傳輸 影片串流、遊戲 Socket 通訊流程 TCP 流程 Server Client │ │ │ 1.

04-1. Thread Safety 基礎概念 ⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐⭐ (簡單) 🤔 什麼是 Thread Safety? 一句話解釋: Thread Safety(線程安全)是指多個 Thread 同時存取共享資源時,程式仍能正確執行,不會產生錯誤結果。 🏢 用銀行帳戶來比喻 不安全的情況 銀行帳戶:餘額 = 1000 元 時間 T0: ├─ 員工 A(Thread A): 讀取餘額 = 1000 └─ 員工 B(Thread B): 讀取餘額 = 1000 時間 T1: ├─ 員工 A: 存入 100 → 計算 1000 + 100 = 1100 └─ 員工 B: 提取 50 → 計算 1000 - 50 = 950 時間 T2: ├─ 員工 A: 寫入 1100 └─ 員工 B: 寫入 950 最終餘額: 950 ← 錯誤!應該是 1050這就是 Thread Safety 問題!

04-2. Race Condition(競態條件) ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等) 🎯 本篇重點 深入理解 Race Condition 的成因、識別方法、影響,以及如何預防和解決這個最常見的 Thread Safety 問題。 🤔 什麼是 Race Condition? Race Condition(競態條件) = 多個 Thread「競賽」存取共享資源,結果取決於執行順序 一句話解釋: 當程式的執行結果取決於 Thread 的執行順序或時機,而這個順序是不可預測的,就發生了 Race Condition。 🏃 用賽跑來比喻 正常的賽跑(無共享資源) 跑者 A ────────→ 終點 A 跑者 B ────────→ 終點 B 各自跑各自的道,互不干擾Race Condition(共享資源) 跑者 A ─┐ ├──→ 同一個計分板 ← 誰先到誰寫入 跑者 B ─┘ 問題: - A 看到分數 = 0,準備寫入 1 - B 看到分數 = 0,準備寫入 1 - A 寫入 1 - B 寫入 1(覆蓋了 A 的結果) - 最終分數 = 1(應該是 2!) 💻 經典 Race Condition 案例 案例 1:計數器問題 from threading import Thread import time counter = 0 def increment(): global counter for _ in range(100000): # 這不是原子操作! counter += 1 # 創建兩個 Thread t1 = Thread(target=increment) t2 = Thread(target=increment) t1.

04-3. Deadlock(死鎖) ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等) 🎯 本篇重點 深入理解 Deadlock 的成因、必要條件、檢測與預防方法,學習如何避免這個可能導致程式完全卡死的嚴重問題。 🤔 什麼是 Deadlock? Deadlock(死鎖) = 多個 Thread 互相等待對方釋放資源,導致所有 Thread 永遠阻塞 一句話解釋: 當兩個或多個 Thread 互相等待對方持有的資源,而誰都無法繼續執行,就發生了 Deadlock。 🚗 用十字路口來比喻 經典的十字路口 Deadlock ↑ 車 C │ 車 B ←──┼──→ 車 D │ ↓ 車 A 狀況: - 車 A 等車 B 離開 - 車 B 等車 C 離開 - 車 C 等車 D 離開 - 車 D 等車 A 離開 結果:所有車都動不了!這就是 Deadlock 💻 經典 Deadlock 案例 案例 1:哲學家就餐問題 from threading import Thread, Lock import time # 5 支筷子(Lock) chopsticks = [Lock() for _ in range(5)] def philosopher(philosopher_id): """哲學家進餐""" left = philosopher_id right = (philosopher_id + 1) % 5 print(f"哲學家 {philosopher_id} 開始思考") time.

04-4. Lock / Mutex / Semaphore 完整指南 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐⭐ (中等) 🎯 本篇重點 完整掌握 Lock、Mutex、Semaphore 等同步機制的原理、用法、差異及最佳實踐,學會選擇最適合的同步工具。 🤔 同步機制概覽 同步機制是用來協調多個 Thread 存取共享資源的工具,防止 Race Condition 和 Deadlock。 同步機制家族 ├─ Lock(鎖) │ ├─ Mutex(互斥鎖) │ └─ RLock(可重入鎖) ├─ Semaphore(信號量) │ ├─ Binary Semaphore(二元信號量) │ └─ Counting Semaphore(計數信號量) ├─ Event(事件) ├─ Condition(條件變數) └─ Barrier(屏障) 1️⃣ Lock(互斥鎖 / Mutex) 基本概念 Lock = 互斥鎖(Mutual Exclusion Lock) from threading import Lock lock = Lock() # 臨界區(Critical Section) lock.

05-1. Python GIL 深度解析 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐⭐ (中等) 🎯 本篇重點 深入理解 Python GIL (Global Interpreter Lock) 的原理、影響以及如何繞過它。 🤔 什麼是 GIL? GIL (Global Interpreter Lock) = 全域解釋器鎖 一句話解釋: GIL 是 Python 解釋器(CPython)的一把全域鎖,確保同一時間只有一個 Thread 可以執行 Python 程式碼。 🏢 用廚房來比喻 沒有 GIL 的語言(如 Java、C++) 廚房(CPU) ├─ 爐子 1(核心 1)→ 廚師 A 炒菜 ├─ 爐子 2(核心 2)→ 廚師 B 炒菜 ├─ 爐子 3(核心 3)→ 廚師 C 炒菜 └─ 爐子 4(核心 4)→ 廚師 D 炒菜 4 個廚師可以同時使用 4 個爐子 ← 真正並行有 GIL 的 Python 廚房(CPU) ├─ 爐子 1(核心 1) ├─ 爐子 2(核心 2) ├─ 爐子 3(核心 3) └─ 爐子 4(核心 4) 但只有一把廚房鑰匙(GIL)! ├─ 廚師 A 持有鑰匙 → 可以用爐子 1 ├─ 廚師 B 等待鑰匙 → 無法工作 ├─ 廚師 C 等待鑰匙 → 無法工作 └─ 廚師 D 等待鑰匙 → 無法工作 同一時間只有一個廚師可以工作 ← 無法並行 🔍 GIL 的實際影響 案例 1:CPU 密集型任務 import time from threading import Thread def cpu_task(): """CPU 密集計算""" total = 0 for i in range(10000000): total += i * i return total # 單 Thread start = time.
0%