Yoru Karu Studio

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

Django 面試準備 04-1:Worker 超時問題

04-1. Worker 超時問題 Worker 超時是 Gunicorn 生產環境中最常見的問題之一。本章將深入探討超時的成因、診斷方法與解決方案。 1. 什麼是 Worker 超時? 超時機制 Gunicorn 使用 主進程監控機制 來管理 Worker: # Gunicorn 的超時檢查機制(簡化版) class Arbiter: def murder_workers(self): """主進程定期檢查 Worker 是否超時""" now = time.time() for worker_pid, worker in self.workers.items(): if (now - worker.last_notif) > self.timeout: # Worker 在 timeout 秒內沒有回應 os.kill(worker_pid, signal.SIGKILL) # 強制殺死 self.log.critical("Worker %s timeout, killed", worker_pid)預設超時時間 # gunicorn.conf.py timeout = 30 # 預設 30 秒 # 超時後會發生什麼: # 1. 主進程發現 Worker 超過 30 秒沒有回應 # 2.

為什麼需要數據庫連接池?Django 性能優化的關鍵

很多人以為「連接數據庫」是瞬間完成的操作,實際上建立一次連接可能需要 20-100 毫秒。在高並發場景下,沒有連接池的 Django 應用會浪費大量時間在重複建立、關閉連接上。

本文將深入分析數據庫連接的真實成本,以及為什麼連接池是生產環境的必備組件。

06-5. Celery vs Channels 如何選擇

一、核心差異比較 1.1 設計目標 Celery:分布式任務隊列 解決問題:異步執行耗時任務,避免阻塞主應用 核心特性:任務調度、延遲執行、定時任務 通訊模式:單向(Producer → Worker) 結果返回:通過 Result Backend 查詢 Channels:實時雙向通訊框架 解決問題:實時雙向通訊需求(WebSocket、SSE) 核心特性:持久連接、實時推送、雙向通訊 通訊模式:雙向(Client ↔ Server) 結果返回:即時推送給連接的客戶端 1.2 技術架構對比 ┌─────────────────────────────────────────────────────────┐ │ Celery 架構 │ ├─────────────────────────────────────────────────────────┤ │ │ │ Django View │ │ │ │ │ ├─► task.delay() ─────► Message Broker │ │ │ (Redis/RabbitMQ) │ │ │ │ │ │ │ ▼ │ │ │ Celery Worker │ │ │ │ │ │ │ ▼ │ │ └─► get result ◄──── Result Backend │ │ (Redis/DB) │ │ │ └─────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────┐ │ Channels 架構 │ ├─────────────────────────────────────────────────────────┤ │ │ │ WebSocket Client │ │ │ │ │ ├──► ws:// connect ─► ASGI Server │ │ │ (Daphne/Uvicorn) │ │ │ │ │ │ │ ▼ │ │ │ Consumer │ │ │ │ │ │ │ ▼ │ │ ◄──── push message ◄── Channel Layer │ │ (Redis) │ │ │ └─────────────────────────────────────────────────────────┘1.
0%