テクノロジー · 実用ガイド

Python の「BrokenProcessPool」?バッチを再試行する前に停止した worker を特定する

親の例外は worker の異常終了を示すだけです。PID と task marker を保存し、spawn、native crash、OOM を分けてから pool を作り直します。

Original technical diagram joining a ProcessPoolExecutor parent task ledger, worker PID markers, and operating-system exit evidence.
オリジナルイラスト:失敗した Future を worker PID と外部の終了証拠に結び付けます。 Watch at Ease

BrokenProcessPool は ProcessPoolExecutor の worker が clean に終了しなかったことを示します。通常の task exception、OOM、segfault、import error のどれかまでは示しません。worker が消えると複数の pending Future が同じ pool-level exception を受け取ります。

parent task ledger、worker PID marker、OS evidence を結合します。一つの cause branch と suspect input を隔離するまで batch 全体を再送しません。

再試行前に parent ledger を固定

submission ごとに task ID と input key、time、Future、side effect boundary を記録します。pool が壊れたら bulk retry を停止し stderr と service log を保存します。

複数 Future の BrokenProcessPool は、各 input が worker を kill した証拠ではありません。

worker start と phase を記録

task entry で PID、task ID、input key、Python version、start method、phase を flush します。initializer は小さく deterministic にし entry と success を記録します。

marker がなければ real .py file、importable main、必要な main guard、top-level callable、serializable argument を試します。fork に盲目的に切り替えません。

native crash と signal evidence を保存

suspect native code の前で faulthandler を有効にし durable stderr を使います。crash report、service status、container reason、child exit code を保存します。

negative exit status は signal の場合がありますが、pool failure 後に他 worker も terminate されます。最初の dead PID と時刻を相関します。

OOM branch を証明または否定

Linux cgroup v2 では実行前後の memory.events または memory.events.local を比較します。oom_kill delta は kill の証拠ですが high、max、oom は同じ意味ではありません。

cgroup path、memory.current、可能なら memory.peak、worker count、input size、per-process copy を記録します。max_workers の低下だけでは証明になりません。

一つの worker と input に縮小

同じ callable を serial に実行し、次に real file から one-worker executor で実行します。task/PID marker を保ち input を二分追加します。

one-worker が成功し multi-worker が失敗するなら total memory、file descriptor、native thread pool、start method を比較します。

causal recovery test で終了

一つの task、一つの PID、normal result または ordinary Future exception、oom_kill 不変、fatal crash なしを closure とします。小さい concurrency で各 input が一度だけ処理されることを確認します。

その後で worker count、memory limit、start method、native dependency、initializer、retry policy を変更し、cause、version、evidence window、idempotency rule を残します。

Original decision diagram separating Python process-pool spawn failures, native crashes, OOM kills, and normal task exceptions.
オリジナルイラスト:並行度や retry policy を変える前に原因 branch を閉じます。 Watch at Ease