科技 · 實用指南
Python 出現 BrokenProcessPool?重建行程池前先保全 worker 結束邊界
這個例外只證明 worker 未正常結束。先保存任務、PID、啟動方式、stderr、結束狀態與 OOM 證據,再選擇匯入、崩潰、容量或部署修復。

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. 修正已證明類別並雙重驗收
分別修正進入點、原生擴充、容量或監督器,不用同一配方處理所有例外。
以相同條件重跑原任務,再讓同一池執行第二個普通任務;兩者通過且無新增事件才驗收。
