ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION1168 / 1500
언어·런타임난이도 중하5분 답변 목표 · 보강본

Python CPU 작업을 프로세스로 옮겼더니 전역 초기화가 반복되거나 실행이 멈춥니다. 프로세스 시작 방식은 왜 중요한가요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

프로세스 시작 방식에 따라 부모 상태를 상속하거나 새 인터프리터에서 모듈을 다시 읽는 방식이 달라집니다. 플랫폼·Python 버전별 기본값을 확인하고 fork·spawn·forkserver의 전제를 구분해야 합니다.

동작 원리와 전제

spawn에서는 진입 모듈이 다시 import될 수 있어 main guard와 직렬화 가능한 함수·인자가 필요합니다. fork는 부모의 스레드·락·라이브러리 상태를 안전하게 복제한다고 볼 수 없어 멀티스레드 프로세스에서 주의해야 합니다.

선택과 실패 처리

큰 데이터를 매번 직렬화하면 계산 병렬화 이득보다 전송 비용이 클 수 있습니다. shared memory는 복사를 줄이지만 수명·동기화·정리가 추가됩니다. 프로세스마다 DB 연결을 새로 만들고 부모 연결을 그대로 재사용하지 않는 등 외부 자원 계약을 확인합니다.

구체적인 사례와 검증

모듈 top-level에서 프로세스 풀을 생성하면 새 인터프리터가 import할 때 같은 생성 코드가 다시 실행될 수 있습니다. 진입점을 보호하고 worker 함수가 import 가능한 위치에 있는지 확인합니다. 부모에서 만들어 둔 DB 연결·네트워크 client를 자식이 안전하게 공유한다고 가정하지 않습니다. 큰 배열을 프로세스로 보낼 때 pickle·복사·메모리 피크를 측정하고 필요한 경우 shared memory를 사용하되 누가 unlink하고 언제 독자가 끝나는지 정합니다. 부모가 취소됐어도 자식 계산이 계속될 수 있어 풀 종료·작업 결과·프로세스 회수를 함께 관리합니다.

모듈 import·작업 실패·부모 종료·큰 인자·프로세스 누수를 시험합니다. CPU 코어 수와 메모리·외부 연결 예산에 맞춰 worker 수를 정합니다. GIL을 피했다는 사실이 모든 병목을 해결한 것은 아닙니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 핵심 구분: 프로세스 시작 방식에 따라 부모 상태를 상속하거나 새 인터프리터에서 모듈을 다시 읽는 방식이 달라집니다.
  • 선택 조건: 큰 데이터를 매번 직렬화하면 계산 병렬화 이득보다 전송 비용이 클 수 있습니다.
  • 검증 기준: 모듈 import·작업 실패·부모 종료·큰 인자·프로세스 누수를 시험합니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • 프로세스를 쓰면 부모의 연결·락·전역 초기화가 모든 플랫폼에서 안전하게 그대로 유지된다고 한다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • I/O 대기와 순수 Python CPU 계산을 어떤 스레드·프로세스 전략으로 나누나요?
  • 주소 공간 공유와 장애 격리·통신 비용을 어떤 실행 단위 선택으로 맞추나요?
  • 데이터 파싱과 임의 객체 생성·후크 실행의 신뢰 경계를 어떻게 나누나요?

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기