01-7. Worker 如何選擇 ⏱️ 閱讀時間: 8 分鐘 🎯 難度: ⭐⭐⭐ (重要!面試必考)
🎯 本篇重點 這是基礎篇最重要的一篇!學會如何根據應用特性選擇正確的 Worker 類型。
⚠️ 新專案?先看這裡! 如果你正在開始一個新的 Django 專案(Django 3.0+),強烈建議直接使用現代的 ASGI 方案:
# 現代推薦方案(新專案) pip install uvicorn[standard] # 開發環境 uvicorn myproject.asgi:application --reload # 生產環境 uvicorn myproject.asgi:application --workers 4 --host 0.0.0.0 --port 8000為什麼?
✅ Python 官方異步標準(asyncio) ✅ Django 3.0+ 原生支持 async views ✅ 更好的生態系統和長期支持 ✅ 不需要 Monkey Patching ✅ 更清晰的 async/await 語法 本篇討論的 Gunicorn Workers 主要適用於:
維護舊的 WSGI Django 專案(Django < 3.
Yoru Karu Studio
程式設計學習筆記 | 生活心得程式設計學習筆記 | 生活心得
01-8. 現代方案:Gunicorn + Uvicorn Workers ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等) 🆕 狀態: 新專案推薦方案
🎯 本篇重點 學習現代 Django 專案(Django 3.0+)的最佳部署方案:使用 Gunicorn 管理 Uvicorn Workers。
🆕 為什麼是 Gunicorn + Uvicorn Workers? 傳統 vs 現代方案對比 # ❌ 傳統方案(WSGI) gunicorn myproject.wsgi:application \ --workers 4 \ --worker-class sync # ⚠️ 單純 Uvicorn(不推薦生產環境) uvicorn myproject.asgi:application \ --workers 4 # ✅ 現代最佳方案(ASGI + Gunicorn 管理) gunicorn myproject.asgi:application \ --workers 4 \ --worker-class uvicorn.workers.UvicornWorker為什麼不直接用 Uvicorn? Uvicorn 的限制:
02-1. Workers 數量計算 ⏱️ 閱讀時間: 10 分鐘
🎯 難度: ⭐⭐⭐ (重要!面試必考)
🎯 本篇重點 學會如何科學地計算和設定 Workers 數量,這是 Gunicorn 配置中最重要的參數。
📐 經典公式 最常見的公式 workers = (2 × CPU_cores) + 1例子:
# 4 核 CPU workers = (2 × 4) + 1 = 9 # 8 核 CPU workers = (2 × 8) + 1 = 17 # 2 核 CPU workers = (2 × 2) + 1 = 5 這個公式的由來 為什麼是 2 × CPU? 假設 4 核 CPU,workers = 9: ├── 4 個 workers:正在使用 CPU(計算) ├── 4 個 workers:正在等待 I/O(資料庫、網絡) └── 1 個 worker:緩衝(應對突發流量) 當 Worker A 在等待 I/O 時: → CPU 空閒 → Worker B 可以使用 CPU → CPU 永遠有事做 ✅視覺化:
02-2. 基礎配置參數 ⏱️ 閱讀時間: 10 分鐘 🎯 難度: ⭐⭐ (簡單)
🎯 本篇重點 掌握 Gunicorn 最重要的基礎配置參數:timeout、keepalive、max_requests、backlog 等。
📋 核心配置參數總覽 最重要的 5 個參數 參數 作用 默認值 推薦值 timeout Worker 超時時間 30 秒 30-120 秒 keepalive Keep-alive 超時 2 秒 2-10 秒 max_requests Worker 重啟閾值 0(不重啟) 1000-2000 backlog 等待連接隊列 2048 2048-4096 worker_connections Worker 並發連接數 1000 1000-10000 ⏱️ timeout(超時時間) 什麼是 timeout? Worker 處理單個請求的最大時間。超過這個時間,Master 會殺掉 Worker 並重啟。
工作原理 請求到達 Worker ↓ 開始計時(timeout 開始) ↓ 處理請求... ↓ ├─ 30 秒內完成 → ✅ 正常返回 └─ 超過 30 秒 → ❌ Worker 被殺掉 → 💥 502 錯誤配置方式 # gunicorn.
02-3. 進階配置技巧 ⏱️ 閱讀時間: 12 分鐘 🎯 難度: ⭐⭐⭐ (中等)
🎯 本篇重點 掌握 Gunicorn 的進階配置技巧:preload_app、graceful_timeout、Hook functions、日誌優化等。
📋 進階參數總覽 參數 作用 默認值 使用場景 preload_app 預載入應用 False 加快啟動、節省記憶體 graceful_timeout 優雅關閉超時 30 秒 平滑重載 worker_tmp_dir Worker 臨時目錄 None 效能優化 limit_request_line 請求行長度限制 4094 安全防護 limit_request_fields 請求頭數量限制 100 安全防護 🚀 preload_app(預載入應用) 什麼是 preload_app? 在 Master 進程啟動時就載入應用代碼,然後 fork 出 Workers,而不是每個 Worker 獨立載入。
工作原理對比 沒有 preload_app(默認) Master 進程啟動 ↓ Master: 我要創建 4 個 workers ↓ ├─ Worker 1 啟動 → 載入 Django 應用(100MB)→ 就緒 ├─ Worker 2 啟動 → 載入 Django 應用(100MB)→ 就緒 ├─ Worker 3 啟動 → 載入 Django 應用(100MB)→ 就緒 └─ Worker 4 啟動 → 載入 Django 應用(100MB)→ 就緒 總記憶體:100MB × 4 = 400MB 啟動時間:慢(每個 worker 都要載入)有 preload_app = True Master 進程啟動 ↓ Master: 載入 Django 應用(100MB) ↓ Master: 用 fork() 複製出 4 個 workers ↓ ├─ Worker 1(複製 Master)→ 就緒(快!) ├─ Worker 2(複製 Master)→ 就緒(快!) ├─ Worker 3(複製 Master)→ 就緒(快!) └─ Worker 4(複製 Master)→ 就緒(快!) 總記憶體:約 150MB(共享記憶體) 啟動時間:快(只載入一次) 配置方式 # gunicorn.
📚 Django 面試準備系列 - 目錄 01. Gunicorn 基礎篇 01-1. Gunicorn 是什麼 ⏱️ 5min 01-2. 為什麼需要 Gunicorn ⏱️ 5min 01-3. Worker 的概念 ⏱️ 8min 01-4. Sync Worker 詳解 ⏱️ 10min 01-5. Gevent Worker 詳解 ⏱️ 10min 01-6. Gthread Worker 詳解 ⏱️ 10min 01-7. Worker 如何選擇 ⏱️ 8min 01-8. 現代方案:Gunicorn + Uvicorn Workers ⏱️ 12min 🆕 02. Gunicorn 配置篇 02-1. Workers 數量計算 ⏱️ 10min 02-2. 基礎配置參數 ⏱️ 10min ✅ 02-3. 進階配置技巧 ⏱️ 12min ✅ 02-4.