Python MultiProcessing

2024. 3. 16. 20:32python

Python의 multiprocessing 모듈은 병렬 처리를 위한 도구를 제공합니다. 이 모듈을 사용하면 여러 개의 프로세스를 동시에 실행하여 작업을 병렬로 처리할 수 있습니다. 이는 멀티코어 CPU 시스템에서 작업을 분산하여 수행함으로써 성능을 향상시키는 데 사용됩니다.

multiprocessing 모듈을 사용하여 병렬 처리를 수행하는 데는 몇 가지 주요 개념이 있습니다.

  1. 프로세스 (Process):

    • multiprocessing.Process 클래스를 사용하여 새로운 프로세스를 생성할 수 있습니다.
    • 각 프로세스는 독립적인 메모리 공간을 가지며, 각각의 프로세스는 별도의 Python 인터프리터 인스턴스를 실행합니다.
    • 각 프로세스는 운영체제에 의해 관리되며, CPU 시간을 할당 받아 실행됩니다.
  2. 풀 (Pool):

    • multiprocessing.Pool 클래스를 사용하여 여러 작업을 병렬로 실행할 수 있습니다.
    • 풀은 워커 프로세스 풀을 관리하고, 작업을 분산하여 처리합니다.
    • 풀을 사용하면 작업의 실행, 완료 및 결과 수집이 간단해집니다.
  3. 프로세스 간 통신 (Inter-Process Communication, IPC):

    • 프로세스 간 통신을 위해 multiprocessing.Queue, multiprocessing.Pipe 등의 도구를 사용할 수 있습니다.
    • 이를 통해 프로세스 간 데이터를 전달하고 통신할 수 있습니다.
  4. 동기화 (Synchronization):

    • 여러 프로세스가 공유된 자원에 안전하게 접근하기 위해 동기화가 필요합니다.
    • multiprocessing.Lock, multiprocessing.Semaphore, multiprocessing.Event 등의 도구를 사용하여 프로세스 간 동기화를 수행할 수 있습니다.

multiprocessing 모듈은 일반적으로 CPU 바운드 작업을 병렬로 처리하는 데 사용됩니다. 이를 통해 CPU의 다중 코어를 활용하여 작업을 가속화할 수 있습니다. 그러나 주의해야 할 점은 병렬 처리가 CPU를 많이 사용하므로, I/O 바운드 작업의 경우에는 병렬 처리의 효과를 기대하기 어렵다는 것입니다.

import multiprocessing
from functools import partial

class ParallelProcessor:
    def __init__(self, num_processes=None):
        if num_processes is None:
            self.num_processes = multiprocessing.cpu_count()
        else:
            self.num_processes = num_processes

    def process_task(self, task_function, data_list):
        with multiprocessing.Pool(processes=self.num_processes) as pool:
            results = pool.starmap(task_function, data_list)

        return results

# 예시 작업 함수
def print_add_three_numbers(text, a, b, c):
    print(text)
    return a, b, c

# 사용 예시
if __name__ == "__main__":
    data = [("First set:", 1, 2, 3), ("Second set:", 4, 5, 6), ("Third set:", 7, 8, 9)]  # 작업할 데이터 리스트
    processor = ParallelProcessor(num_processes=4)  # 병렬 처리 객체 생성

    # 데이터를 병렬로 출력하고 반환하기
    results = processor.process_task(partial(print_add_three_numbers), data)

    print("Results:", results)