본문 바로가기
컴퓨터/Python

[Python] 파이썬, multiprocessing 간단 예제

by sjblog 2023. 3. 27.
반응형

파이썬을 이용하며, 속도를 개선하기 위한 방법으로 병렬처리를 할 수 있습니다.

 

병렬처리는 여러 개의 CPU 코어를 사용하여 동시에 작업을 처리하는 방법입니다.

 

1. Pool

import multiprocessing

def calculate(a, b, c):
    return a * b + c

if __name__ == '__main__':
    # 입력 값 리스트 생성
    input_list = [(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]

    # 프로세스 풀 생성
    pool = multiprocessing.Pool(processes=4)

    # 병렬 처리를 위한 map 메서드 호출
    output_list = pool.starmap(calculate, input_list)

    # 프로세스 풀 종료
    pool.close()
    pool.join()

    print(output_list)
    # [5, 26, 65, 143]

 

간단하죠?

 

if __name__ == '__main__':

 

이것은 해당 파일이 메인 프로그램으로서 실행되는지 확인하기 위해 사용됩니다.

 

부모 프로세스는 자식 프로세스를 생성하고, 자식 프로세스는 부모 프로세스로부터 생성되어 실행됩니다.

 

부모 프로세스와 자식 프로세스 간의 메모리 공간이 분리되어야 함을 보장하기 위해 사용됩니다.

 

if __name__ == '__main__': 구문이 없다면 자식 프로세스가 multiprocessing을 실행할 때마다 새로운 자식 프로세스가 생성될 것이고, 이는 무한한 자식 프로세스 생성을 유발할 수 있습니다.

 

2. Process

import multiprocessing

def square(n):
    print(f"square({n}) = {n**2}")

def cube(n):
    print(f"cube({n}) = {n**3}")

if __name__ == '__main__':
    # 자식 프로세스로 실행할 함수와 인자를 리스트로 정의
    jobs = [(square, 2), (cube, 3), (square, 4), (cube, 5)]

    # 자식 프로세스 생성 및 실행
    processes = []
    for job in jobs:
        p = multiprocessing.Process(target=job[0], args=(job[1],))
        processes.append(p)
        p.start()

    # 자식 프로세스가 실행을 완료할 때까지 대기
    for p in processes:
        p.join()

 

멀티프로세싱은 Pool과 Process 클래스를 제공합니다. 그러나, Pool과 Process는 사용 목적이 다릅니다.

 

Pool은 사전에 지정한 개수만큼 프로세스를 생성하여 이들을 pool에 담아두고, 작업이 있을 때마다 이 pool에서 프로세스를 꺼내 작업을 처리합니다.

 

반면, Process는 개별 프로세스를 생성하여 각각의 프로세스에서 작업을 처리합니다.

 

Pool은 CPU 바운드 작업에 적합, Process는 I/O 바운드 작업에 적합합니다.

(CPU 바운드: CPU 성능에 따라 속도가 결정되는 작업. 예) 계산 작업)

(I/O 바운드 작업: input과 ouput 즉, 파일 입출력, 네트워크 통신, 데이터베이스 퀄 등 작업)

 

Pool은 작업을 넣어주면 알아서 분산 처리를 하고, Process는 각 프로세스에 명시적으로 작업을 설정해야 합니다.

 

3. return 값 가져오기

from multiprocessing import Process, Manager

class MyProcess(Process):
    def __init__(self, num, result_dict):
        super().__init__()
        self.num = num
        self.result_dict = result_dict
        
    def run(self):
        print("Process {} is started".format(self.num))
        # 멀티프로세싱에서 실행할 코드 작성
        self.result_dict[self.num] = self.num
        print("Process {} is finished".format(self.num))
        
if __name__ == '__main__':
    manager = Manager()
    result_dict = manager.dict()

    process_list = []

    
    for i in range(5):
        process_list.append(MyProcess(i, result_dict))

    for process in process_list:
        process.start()

    for process in process_list:
        process.join()
        
    for i in range(len(process_list)):
        print(result_dict[i])

클래스 형식으로 간단한 예제를 만들었습니다.

 

리턴 값을 Manager에 저장하여 가져옵니다.

4. threading 모듈

https://sjblog1.tistory.com/75

 

[Python] 파이썬, threading 간단 예제

파이썬을 이용하며, 속도를 개선하기 위한 방법으로 병렬처리를 할 수 있습니다. threading 모듈은 스레드 기반, multiprocessing 모듈은 프로세스 기반으로 동작합니다. 따라서, 속도 차이가 발생할 수

sjblog1.tistory.com

 

반응형