멀티 프로세싱
부모 프로세스가 OS에 요청해 자식 프로세스를 만드는 과정을 process spawning이라고 하는데, 파이썬에서는 multiprocessing과 같은 모듈을 이용하면 process spawning을 쉽게 수행할 수 있다. 즉, 부모 프로세스가 많은 작업을 처리할 때 작업 중 일부를 자식 프로세스에게 위임하여 처리하는 멀티 프로세싱을 수행할 수 있다.
멀티 프로세싱을 사용하면 복잡하거나 양이 많아 오래 걸리는 작업을 병렬 처리할 수 있어 단일 프로세스를 사용할 때보다 짧은 소요시간을 기대할 수 있다.
이 글에서는 멀티 프로세싱을 위한 mutliprocessing 모듈 사용법을 간단히 정리한다.
모듈 import
아래와 같이 multiprocessing 라이브러리를 import 하여 사용할 수 있다. 관례적으로 mp라는 이름을 사용한다.
import multiprocessing as mp
현재 프로세스 정보 확인
mp.current_process 함수를 사용하여 실행된 프로세스의 정보가 저장된 객체를 얻을 수 있다.
import multiprocessing as mp
if __name__ == "__main__":
proc = mp.current_process()
print(proc.name)
print(proc.pid)
process spawning
process spawning을 할 때는 Process 객체를 생성한 뒤, start 함수를 실행한다. Process 객체를 생성할 때는 생성할 자식 프로세스의 이름과 실행시킬 함수를 전달해야 한다. 자식 프로세스를 종료할 때는 join 함수를 사용한다.
import multiprocessing as mp
def worker():
print("SubProcess End")
if __name__ == "__main__":
p = mp.Process(name="SubProcess", target=worker)
p.start()
print(p.name)
print(p.pid)
p.join()
프로세스 pool 사용
여러 개의 자식 프로세스를 실행시킬 때는 Pool 객체를 이용해 실행시킬 프로세스의 개수를 정의한 뒤, map 함수를 사용해 자식 프로세스가 실행할 함수와 함수 실행에 필요한 데이터를 전달한다.
import multiprocessing as mp
def worker(cnt):
print(cnt)
if __name__ == "__main__":
list_data = [f'cnt_{i}' for i in range(200)]
pool = mp.Pool(processes=3)
pool.map(worker, list_data)
참고 문서
https://niceman.tistory.com/145