02-6. Multi-threading vs Multi-processing 完整對比 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐ (簡單)
🎯 本篇重點 深入理解 Multi-threading(多執行緒)和 Multi-processing(多進程)的核心差異、適用場景及實戰案例。
🤔 核心差異:一句話總結 Multi-threading:一個程式內創建多個 Thread,共享記憶體空間。 Multi-processing:一個程式創建多個獨立 Process,各自擁有完全隔離的記憶體空間。
🏢 公司組織比喻 Multi-threading = 開放式辦公室 Yoru-Karu Studio(單一公司 = 1 個 Process) │ ├─ 共享辦公空間(共享記憶體) │ ├─ 員工 A(Thread 1)→ 處理訂單 │ ├─ 員工 B(Thread 2)→ 接聽客服電話 │ ├─ 員工 C(Thread 3)→ 更新官網內容 │ └─ 員工 D(Thread 4)→ 回覆客戶郵件 │ └─ 共享資源 ├─ 共用白板、檔案櫃(所有員工可直接存取) ├─ 溝通超快(面對面對話) ├─ 但可能搶資源(需要排隊協調) └─ 一人出錯可能影響全辦公室特點:
Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
02-7. 何時用 Thread?何時用 Process?決策指南 ⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐⭐ (簡單)
🎯 本篇重點 提供清晰的決策樹和實戰案例,幫助你快速判斷何時使用 Thread、何時使用 Process。
🤔 快速決策流程圖 開始:我需要併發處理 ↓ ┌──────────────────────────┐ │ 任務類型是什麼? │ └──────────────────────────┘ ↓ ├─ I/O 密集型(網路、檔案、資料庫) │ → 使用 Multi-threading │ └─ 需要大量併發(>1000)? │ ├─ 是 → 使用 asyncio │ └─ 否 → 使用 threading │ └─ CPU 密集型(計算、資料處理) → 使用 Multi-processing └─ 需要數據共享? ├─ 否 → 使用 Pool └─ 是 → 使用 Process + Manager/Value 📊 決策矩陣 情境 1:任務類型 任務類型 推薦方案 原因 網路請求 Thread I/O 等待時釋放 GIL 檔案讀寫 Thread I/O 操作 資料庫查詢 Thread I/O 等待 數學計算 Process 需要 CPU 並行 影像處理 Process CPU 密集 資料分析 Process CPU 密集 大量併發 I/O asyncio 最高效 情境 2:程式特性 需求 Thread Process 需要共享大量資料 ✅ 推薦 ❌ 成本高 需要完全隔離 ❌ 不行 ✅ 推薦 需要快速創建 ✅ 推薦 ❌ 較慢 需要穩定性 ❌ 一崩全崩 ✅ 隔離 需要利用多核 ❌ GIL 限制 ✅ 可以 數量需要很多 ✅ 可以 ❌ 受限 🔍 實戰案例分析 案例 1:網路爬蟲 需求:
03-1. IPC 概述 ⏱️ 閱讀時間: 8 分鐘 🎯 難度: ⭐⭐ (簡單)
🤔 什麼是 IPC? IPC (Inter-Process Communication) = 進程間通訊
一句話解釋: 讓不同的 Process 能夠互相傳遞資料和訊息的機制。
🏢 用公司來比喻 公司 A(Process A) 公司 B(Process B) ├─ 辦公室 A ├─ 辦公室 B ├─ 獨立資源 ├─ 獨立資源 └─ 員工 └─ 員工 問題:兩家公司如何溝通?IPC 機制 = 公司間的溝通方式:
📞 Pipe = 電話專線 📨 Message Queue = 郵件系統 📂 Shared Memory = 共用雲端硬碟 🌐 Socket = 網路會議 📋 IPC 的五種主要方式 1.
03-2. Pipe(管道)詳解 ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐ (簡單)
🤔 一句話解釋 Pipe(管道)是一種單向或雙向的通訊通道,主要用於父子 Process 或相關 Process 之間的資料傳輸。
📞 用電話專線來比喻 Process A Process B ├─ 寫入端 ──────────→ 讀取端 │ └─ 就像電話專線: - 一端說話(寫入) - 另一端聽(讀取) - 點對點連接 🔧 Pipe 的類型 1. 單向 Pipe (One-way Pipe) from multiprocessing import Process, Pipe def sender(conn): """發送端""" messages = ["Hello", "World", "from", "Process A"] for msg in messages: conn.send(msg) print(f"發送: {msg}") conn.close() def receiver(conn): """接收端""" while True: try: msg = conn.
03-3. Message Queue(消息佇列)詳解 ⏱️ 閱讀時間: 15 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🤔 一句話解釋 Message Queue(消息佇列)是一種多對多的 IPC 機制,允許多個生產者和消費者通過 FIFO 佇列交換訊息。
📨 用郵件系統來比喻 生產者(發件人) 消息佇列(郵局) 消費者(收件人) │ ┌──────┐ │ ├──── 訊息 1 ──────→ │訊息 1 │ ────→ 消費者 A │ ├──────┤ │ ├──── 訊息 2 ──────→ │訊息 2 │ ────→ 消費者 B │ ├──────┤ │ └──── 訊息 3 ──────→ │訊息 3 │ ────→ 消費者 C └──────┘ 特點: - 訊息排隊等待處理 - 先進先出(FIFO) - 支援多個發送者和接收者 - 非同步通訊 🎯 Queue 的基本用法 1.
03-4. Shared Memory(共享記憶體) ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🎯 本篇重點 深入理解 Shared Memory 這種最快的 IPC 方式,學習如何在多個 Process 間安全地共享資料。
🤔 什麼是 Shared Memory? Shared Memory(共享記憶體) = 多個 Process 共用同一塊記憶體區域
一句話解釋: 讓多個獨立的 Process 直接存取同一塊記憶體,避免資料複製,是最快的 IPC 方式。
🏢 用辦公室來比喻 普通 IPC(Pipe、Queue) Process A 辦公室 Process B 辦公室 ├─ 文件 A ├─ 文件 B(複製的) │ │ └──→ 傳真機 ──→ 傳真機 ──┘ 每次溝通都要複製文件(慢、耗資源)Shared Memory Process A 辦公室 Process B 辦公室 ├─ 員工 ├─ 員工 │ │ └──→ 共用雲端硬碟 ←──────┘ (同一份檔案) 兩邊直接存取同一份檔案(快、高效) 但需要鎖定機制避免衝突 💻 Shared Memory 原理 記憶體佈局對比 普通 Process(獨立記憶體) Process A (PID 1001) Process B (PID 1002) ├─ Code Segment ├─ Code Segment ├─ Data: counter = 0 ├─ Data: counter = 0(獨立副本) ├─ Heap ├─ Heap └─ Stack └─ Stack 無法直接共享資料Shared Memory Process A (PID 1001) Process B (PID 1002) ├─ Code Segment ├─ Code Segment ├─ Data ├─ Data ├─ Heap ├─ Heap │ └─ 指向共享記憶體 │ └─ 指向共享記憶體 └─ Stack └─ Stack ↓ ↓ └──→ Shared Memory ←─────────┘ counter = 100 兩個 Process 存取同一塊記憶體 1️⃣ Python Shared Memory 基礎 Value:共享單一值 from multiprocessing import Process, Value import time def increment(shared_value, name): """增加共享值""" for _ in range(5): shared_value.