Python multiprocessing - .exe 변환 후 무한 재귀 실행 문제 해결법!
Python의 multiprocessing을 사용하여 멀티 프로세스를 실행할 때, Windows 환경에서 .exe로 변환하면 자식 프로세스가 무한 루프에 빠지는 문제가 발생할 수 있습니다. 이 문제는 Windows의 spawn 방식과 관련이 있으며, 이를 해결하지 않으면 프로그램이 무한히 실행되면서 CPU를 과도하게 사용하거나 정상 종료되지 않는 문제가 생깁니다. 이번 포스팅에서는 이 문제의 원인과 해결 방법을 설명하고, 실제 예제 코드와 올바른 실행 방법을 제공합니다.
📖 1. multiprocessing의 .exe 변환 후 무한 실행 문제란?
Python에서 multiprocessing을 사용할 때, Windows와 Linux에서 프로세스를 생성하는 방식이 다릅니다.
✅ Linux → fork 방식 (부모 프로세스를 복사하여 실행)
✅ Windows → spawn 방식 (새로운 프로세스를 생성 후 부모 프로세스를 다시 실행)
Windows에서는 spawn 방식을 사용하기 때문에, 새로운 자식 프로세스가 부모 프로세스를 다시 실행하는 문제가 발생할 수 있습니다.
특히, .exe로 변환하면 자식 프로세스가 무한 반복해서 실행되는 문제가 발생할 수 있습니다.
⚙️ 2. 무한 실행 문제가 발생하는 원인
- Windows는 기본적으로 spawn 방식 사용
- 새로운 프로세스를 생성할 때 부모 프로세스를 다시 실행합니다.
- .exe 실행 시, 무한히 새로운 프로세스가 생성되면서 실행이 반복됩니다.
- if __name__ == "__main__":가 없을 경우
- Python의 multiprocessing은 메인 스크립트가 여러 번 실행되지 않도록 보호해야 합니다.
- 이 코드가 없으면 Windows에서 .exe 실행 시 무한 루프에 빠질 가능성이 높아집니다.
- .exe 실행 시 multiprocessing.freeze_support() 미사용
- Windows에서 multiprocessing을 사용해 .exe를 만들 경우, freeze_support()를 추가해야 합니다.
- 이 함수는 .exe 실행 시 부모 프로세스를 다시 실행하지 않도록 막아줍니다.
🛠️ 3. 해결 방법: 무한 실행을 방지하는 코드
✅ 방법 1: if __name__ == "__main__": 추가
반드시 if __name__ == "__main__": 블록 안에서 multiprocessing을 실행해야 합니다.
import multiprocessing
def worker():
print("Worker process is running...")
if __name__ == "__main__": # 메인 프로세스 보호
p = multiprocessing.Process(target=worker)
p.start()
p.join()
✅ 방법 2: multiprocessing.freeze_support() 추가
Windows에서 .exe 실행 시 필수적으로 freeze_support()를 호출해야 합니다.
import multiprocessing
def worker():
print("Worker process is running...")
if __name__ == "__main__":
multiprocessing.freeze_support() # Windows에서 .exe 실행 시 필수
p = multiprocessing.Process(target=worker)
p.start()
p.join()
✅ 방법 3: spawn 방식을 명시적으로 설정
Python 3.8 이상에서는 set_start_method("spawn")을 명시적으로 설정해야 할 수도 있습니다.
import multiprocessing
def worker():
print("Worker process is running...")
if __name__ == "__main__":
multiprocessing.freeze_support()
multiprocessing.set_start_method("spawn", force=True) # Windows 환경 설정
p = multiprocessing.Process(target=worker)
p.start()
p.join()
📌 4. 해결 방법 비교표
방법 | 설명 | 필요 여부 |
✅ if __name__ == "__main__": | 메인 프로세스만 실행하도록 보호 | 필수 |
✅ multiprocessing.freeze_support() | Windows에서 .exe 실행 시 필수 | .exe 변환 시 필수 |
✅ set_start_method("spawn") | Windows에서 spawn 방식 명시적 설정 | Python 3.8 이상에서 유용 |
🔎 5. PyInstaller로 .exe 만들기
위에서 해결 방법을 적용한 후, PyInstaller를 사용하여 .exe 파일을 생성하면 정상적으로 실행됩니다.
✅ .exe 변환 명령어
pyinstaller --onefile myscript.py
- --onefile 옵션은 단일 실행 파일로 패키징합니다.
✅ .exe 실행 시 주의사항
- multiprocessing.freeze_support()를 추가하지 않으면 무한 실행 문제가 발생할 수 있음.
- if __name__ == "__main__":을 반드시 사용해야 함.
🎯 6. 결론
- Windows 환경에서 multiprocessing을 .exe로 변환하면 자식 프로세스가 무한 실행되는 문제가 발생할 수 있습니다.
- 이를 방지하려면 세 가지 해결 방법을 적용해야 합니다.
- if __name__ == "__main__": 블록 추가 (필수)
- multiprocessing.freeze_support() 사용 (.exe 변환 시 필수)
- set_start_method("spawn")을 명시적으로 설정 (Python 3.8+ 권장)
- .exe 실행 시 무한 루프를 방지하려면 위의 방법을 반드시 적용해야 합니다.
'코딩취미 > Python' 카테고리의 다른 글
PySide6에서 윈도우 크기 자동 조절 기능 구현하기 (0) | 2025.03.03 |
---|---|
Seaborn vs Plotly: 데이터 시각화 라이브러리 비교 (0) | 2025.03.02 |
multiprocessing.freeze_support() 완벽 가이드 - 동작 원리, 필요성, 예제 코드까지! (0) | 2025.03.01 |
파이썬에서 멀티태스킹과 멀티스레드 사용법 (0) | 2025.02.28 |
파이썬에서 안전하게 멀티스레드 생성 및 관리하기(QThreadPool, QRunnable) (0) | 2025.02.28 |