본문 바로가기
인공지능 개발하기/Backend

[Python 이슈] Python multiprocessing 구현 시 ModuleNotFoundError 발생

by 선의공 2024. 11. 17.

 

 

 

AI Model Serving을 위한 backend 개발을 공부하고 있습니다.

개발 간 이슈가 있어서 삽질한 내용 공유합니다.

 


 

1. 이슈 상황

 

Python의 multiprocessing 라이브러리를 이용해서

 Multiprocessing 서비스를 구축하고 있는데요 

 

특정 클래스 내에서 Multiprocessing을 구축하려니

import한 module을 못 찾는다는 오류입니다.

ModuleNotFoundError: No module named '<다른 모듈명>'

 

 


 

2. 이유 

 

찾아보니 이유는

프로세스가 자식 프로세스로 실행될 때 해당 모듈을 찾을 수 없어서 생긴다고 합니다.

 

Windows 환경에서 실행될 때 발생한다고 하네요.

Linux나 macOS에서는 부모 프로세스의 메모리를 자식 프로세스가 공유하는

fork() 방식이 사용되기 때문에 이 문제가 발생하지 않는다고 합니다.

 

 


 

2. 해결 방법

 

해결방법

 

Multiprocessing 선언 및 프로세스 생성 및 시작을  if __name__ == '__main__' 에서 명시하기

import multiprocessing
import my_module  # 사용자 정의 모듈

def worker():
    result = my_module.some_function()  # 모듈 내 함수 사용
    print(result)

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn', force=True)
    p = multiprocessing.Process(target=worker)
    p.start()
    p.join()

 

 

설명

if __name__ == '__main__' 내의 코드는 모듈이 직접 실행 될 때 반드시 호출됩니다.

또한, import 될때는 실행되지 않는 독립적 실행 방식입니다.

 

set_start_method()가 멀티프로세싱의 시작 방법을 설정하는 함수입니다.

해당 함수는 모듈 단위에서 실행되는 multiprocessing에서

모듈이 실행되는 시작부분에서 선언이 되어야합니다.

 

multiprocessing은 독립적인 프로세스를 생성하고,

이 프로세스들이 병렬로 실행되도록 돕는 라이브러리입니다.

따라서, 멀티프로세싱을 사용할 때 set_start_method()를

if __name__ == '__main__'   시점에 호출해야 

적절한 호출이 됩니다.그 이후 프로세스 생성 및 시작을 진행합니다.

 

 


 

3. 결론 

multiprocessing을 사용하는 코드를 if __name__ == '__main__' 보호구문 안에 넣어줘야 합니다.

 

Python에서 multiprocessing 모듈을 사용할 때,

자식 프로세스가 부모 프로세스를 복제하는 방식으로 실행되기 때문에,(Windows 에서 주로..)

multiprocessing을 사용하는 코드를 if __name__ == '__main__' 보호구문 안에 넣어줌으로서

자식 프로세스가 불필요하게 모듈을 재실행하지 않도록 할 수 있습니다.

 

 

 

 


참조

 

 

아래의 python docs를 참조했습니다.

https://docs.python.org/3.7/library/multiprocessing.html

 

multiprocessing — Process-based parallelism — Python 3.7.17 documentation

Source code: Lib/multiprocessing/ Introduction multiprocessing is a package that supports spawning processes using an API similar to the threading module. The multiprocessing package offers both local and remote concurrency, effectively side-stepping the G

docs.python.org