기술 · 실용 가이드
Python 3.14 프로세스 풀이 샌드박스에서 실패하나요? forkserver Unix 소켓부터 검사하세요
작업 직렬화 전에 실패할 수 있습니다. 쓰기 불가 임시 디렉터리와 AF_UNIX 정책 거부를 나눈 뒤 spawn, 단일 worker 또는 근거 있는 컨텍스트를 고릅니다.

Python 3.14는 지원 POSIX에서 기본 시작 방식을 fork에서 forkserver로 바꿨습니다. 별도 서버와 로컬 Unix 소켓을 사용하므로 worker가 모듈을 가져오기 전 제한 환경에서 실패할 수 있습니다.
모든 추적을 pickle 오류로 부르거나 fork를 자동 탈출구로 쓰지 마세요. 임시 저장소, AF_UNIX 생성·bind, 경로 길이, import 안전성, 작업 직렬화 중 어느 경계인지 먼저 확인합니다.
1. 첫 worker 이전의 실패 위치 확인
sys.version, platform, get_start_method()와 전체 추적을 기록합니다. 끝이 ensure_running, arbitrary_address, gettempdir 또는 listener.bind면 사용자 함수는 시작되지 않았습니다.
사용 가능한 임시 디렉터리 없음, AF_UNIX 경로 과다, 생성·bind EPERM을 분리합니다. 이후 PicklingError나 로컬 함수 AttributeError는 직렬화 분기입니다.
2. 임시 디렉터리와 Unix 소켓을 따로 검사
실패 작업과 같은 샌드박스와 사용자에서 일회용 프로브를 실행합니다. 임시 디렉터리에 로컬 AF_UNIX 경로를 bind하고 종료 시 삭제합니다. 네트워크 서비스는 만들지 않습니다.
mkdtemp가 실패하면 임시 저장 경계를 고치거나 문서화된 대체가 있는 패치로 올립니다. 디렉터리는 되지만 AF_UNIX가 EPERM이면 TMPDIR 변경은 권한을 주지 않습니다. 둘 다 되면 1개 항목 forkserver 풀을 시험합니다.
3. 패치 버전 경계를 정확히 읽기
현재 3.14 문서는 지원 POSIX 기본이 forkserver이며 3.14.9부터 쓰기 가능한 임시 경로가 없으면 spawn이라고 설명합니다. 이전 3.14는 OSError가 날 수 있습니다.
이 대체는 좁습니다. 쓰기 가능한 디렉터리와 AF_UNIX 거부는 공존할 수 있고 경로 과다도 별도입니다. 예외, 버전, 경로를 보존하세요.
4. 가장 좁고 안전한 대응 선택
애플리케이션은 get_context('spawn') 또는 ProcessPoolExecutor의 mp_context를 사용합니다. worker를 모듈 범위에 두고 main 가드를 적용하며 pickle 가능한 데이터를 전달합니다. 라이브러리는 호출자 컨텍스트를 받습니다.
worker 수를 제공하는 CLI에서는 단일 worker가 가장 작은 대체입니다. 병렬이 필수면 환경 소유자에게 좁은 로컬 Unix 소켓 허용을 요청하고 원격 서비스로 정책을 우회하지 않습니다.
fork는 스레드와 라이브러리 상태가 안전함을 증명한 앱만 사용합니다. 실행 성공은 능력만 보여 줍니다.
5. spawn에서 의미 재검증
spawn은 새 인터프리터를 시작합니다. 중첩 함수와 lambda를 import 가능한 위치로 옮기고 진입점을 보호하며 initializer에서 각 프로세스 리소스를 만듭니다. 서로 다른 컨텍스트의 lock은 호환되지 않을 수 있습니다.
DB 연결, 이벤트 루프, 라이브 클라이언트를 넘기지 말고 설정과 ID를 넘겨 worker에서 엽니다.
6. 경계 행렬로 승인
임시 디렉터리 생성, AF_UNIX bind, 1개 항목 forkserver 풀과 spawn 풀을 기록하고 실제 도구를 단일 worker와 선택 컨텍스트로 실행해 종료 코드와 산출물 해시를 저장합니다.
의도한 분기가 성공하고 잘못된 대상은 예상 import 또는 pickle 오류로 실패하며 소켓 잔여가 없고 출력이 단일 worker 기준과 일치할 때만 승인합니다.
