Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

Python 出現 BrokenProcessPool?重建行程池前先保全 worker 結束邊界

這個例外只證明 worker 未正常結束。先保存任務、PID、啟動方式、stderr、結束狀態與 OOM 證據,再選擇匯入、崩潰、容量或部署修復。

原創圖示:BrokenProcessPool 任務到 worker 結束證據鏈。
原創示意圖:重建行程池前保全第一個結束邊界。 Watch at Ease

BrokenProcessPool 不等於 OOM,也不表示 __main__ 必然錯誤;它只表示 ProcessPoolExecutor worker 未乾淨結束。

把一次失敗綁到任務、worker 與系統事件,依證據分類後只修正一個已證明邊界,再用同一任務與第二個普通任務驗收。

1. 重建前凍結一次失敗

記錄任務 ID、輸入指紋、提交時間、Python 版本、平台、執行器參數與啟動方式,保存完整例外鏈。

不要先自動重試;在相同模組、initializer、啟動方式與資源限制下縮成一個失敗任務。

2. 區分進入點失敗與行程死亡

確認保存的 __main__ 可匯入、建立行程的程式碼已保護、函式與資料可序列化,再以相同啟動方式跑頂層小函式。

小任務未開始就修進入點或 initializer;真實任務開始後才破池則繼續取退出證據。

3. 捕捉 worker 結束邊界

記錄任務 ID、PID、initializer 完成、任務開始、stderr 與 faulthandler,並確保檔案在行程池清除後仍存在。

避免把私有 executor 屬性當正式介面,依版本保留可取得的結束碼、訊號與宿主崩潰紀錄。

4. 關聯訊號、OOM 與部署事件

Linux 上比較 memory.events;只有同一工作負載時間窗內的 oom_kill 增量才證明 OOM。

把尖峰記憶體、併發、輸入大小、服務重啟與操作終止放進同一時間線;缺證據就保持未決。

5. 修正已證明類別並雙重驗收

分別修正進入點、原生擴充、容量或監督器,不用同一配方處理所有例外。

以相同條件重跑原任務,再讓同一池執行第二個普通任務;兩者通過且無新增事件才驗收。

原創圖示:匯入、訊號與 OOM 證據分類矩陣。
原創示意圖:不同證據需要不同修復與驗收。 Watch at Ease