본문 바로가기
코딩취미/Python

Python multiprocessing - .exe 변환 후 무한 재귀 실행 문제 해결법!

by 브링블링 2025. 3. 1.
반응형

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. 무한 실행 문제가 발생하는 원인

  1. Windows는 기본적으로 spawn 방식 사용
    • 새로운 프로세스를 생성할 때 부모 프로세스를 다시 실행합니다.
    • .exe 실행 시, 무한히 새로운 프로세스가 생성되면서 실행이 반복됩니다.
  2. if __name__ == "__main__":가 없을 경우
    • Python의 multiprocessing은 메인 스크립트가 여러 번 실행되지 않도록 보호해야 합니다.
    • 이 코드가 없으면 Windows에서 .exe 실행 시 무한 루프에 빠질 가능성이 높아집니다.
  3. .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로 변환하면 자식 프로세스가 무한 실행되는 문제가 발생할 수 있습니다.
  • 이를 방지하려면 세 가지 해결 방법을 적용해야 합니다.
    1. if __name__ == "__main__": 블록 추가 (필수)
    2. multiprocessing.freeze_support() 사용 (.exe 변환 시 필수)
    3. set_start_method("spawn")을 명시적으로 설정 (Python 3.8+ 권장)
  • .exe 실행 시 무한 루프를 방지하려면 위의 방법을 반드시 적용해야 합니다.
반응형