기술 · 실용 가이드
Python BrokenProcessPool인가요? 풀을 다시 만들기 전에 worker 종료 경계를 보존하세요
이 예외는 worker가 비정상 종료했다는 사실만 말합니다. task, PID, 시작 방식, stderr, 종료 상태와 OOM 증거를 보존한 뒤 수정을 선택하세요.

BrokenProcessPool은 OOM이나 __main__ 오류를 단정하지 않습니다. ProcessPoolExecutor worker가 깨끗하게 끝나지 않은 경계입니다.
실패 한 건을 task, worker와 시스템 사건에 연결하고 증거가 가리키는 경계 하나만 수정한 뒤 같은 task와 일반 task로 검증하세요.
1. 풀 재생성 전에 실패 하나를 고정하세요
task ID, 입력 fingerprint, 제출 시각, Python, 플랫폼, executor 설정, start method와 예외 chain을 보존하세요.
자동 재시도 전에 같은 module, initializer, start method와 limit에서 한 건으로 줄이세요.
2. entry point 실패와 process death를 나누세요
저장된 __main__ import, guard, callable·인자·반환값 pickle을 확인하고 같은 방식으로 단순 top-level 함수를 실행하세요.
단순 task가 시작하지 않으면 entry point 쪽을, 실제 task 시작 후 깨지면 종료 증거를 조사하세요.
3. worker 종료 경계를 수집하세요
task ID, PID, initializer 완료, task 시작, stderr와 faulthandler 출력을 풀 종료 후에도 남는 위치에 기록하세요.
private executor 속성에 의존하지 말고 버전별 exit code, signal과 host crash log를 보존하세요.
4. signal, OOM과 배포 사건을 연결하세요
Linux에서는 memory.events 전후를 비교하고 같은 workload 시간대의 oom_kill 증가만 OOM 증거로 사용하세요.
peak memory, concurrency, input size, restart와 operator kill을 한 timeline에 두고 증거가 없으면 미결로 남기세요.
5. 증명된 원인만 고치고 두 번 검증하세요
entry point, native extension, capacity 또는 supervisor를 원인별로 수정하세요.
동일 조건의 원래 task와 같은 풀의 두 번째 일반 task가 모두 성공하고 새 crash/OOM 사건이 없어야 승인하세요.
