본문 바로가기
Python/파이썬 문법, 함수, 모듈 등

[Python] 1. Multiprocessing(멀티 프로세싱) 설명과 사용법

by dong_su 2024. 5. 28.

Multiprocessing(멀티 프로세싱)

멀티 프로세싱을 활용하면 여러 작업을 별도의 프로세스를 생성 후 병렬처리해서 더 빠르게 결과를 얻을 수 있다.
멀티 프로세싱을 잘 활용하면 멀티코어의 CPU 장점을 잘 살릴 수 있지만, 
병렬 프로그래밍의 이해 없이 코드를 작성하면 싱글 프로세스보다 더 느린 경우나, 
예상하지 못한 결과가 나올 수 있으니 프로세스, 쓰레드에 대한 이해가 필요하다.
 
* 멀티 프로세싱은 메모리 사용률이 높아지는 단점이 있다.


방법 1: Process 객체를 이용한 방법

import os
from multiprocessing import Process

# 실행할 함수
def f(name):
    print(f"Hello, {name}")

if __name__ == "__main__":
    processes = []  # 프로세스 리스트 생성

    # 프로세스 객체 생성 및 시작
    for i in range(5):
        p = Process(target=f, args=(f"proc_{i}",))
        processes.append(p)
        p.start()

    # 모든 프로세스가 종료될 때까지 대기
    for p in processes:
        p.join()

    print("All processes have finished.")

-> 함수 f에 인자 proc_0, proc_1, ... 을 넣어 프로세스 객체 생성

-> start() 메서드로 실행하고 join()메서드가 프로세스가 종료될 때까지 대기(블록킹 함수)

 

방법 2: Pool 객체를 이용한 방법

from multiprocessing import Pool
import time

# 실행할 함수
def count(name):
    for i in range(5):
        print(f"{name}: {i}")
        time.sleep(1)

if __name__ == "__main__":
    start_time = time.time()
    
    # Pool 객체 생성
    p_list = ["proc_1", "proc_2", "proc_3", "proc_4"]
    pool = Pool(processes=4)
    
    # 병렬 처리
    pool.map(count, p_list)
    
    # Pool 닫기
    pool.close()
    
    # 모든 작업이 완료될 때까지 대기
    pool.join()

 

multiprocessing.Pool 클래스에 사용되는 함수로는 map(), imap(), starmap()이 있다.

  1. map() 함수
    • 모든 작업을 한 번에 Pool에 넘겨서 병렬 처리를 하고, 작업이 완료된 후에 결과를 순서대로 반환합니다.
    • 각 작업에는 하나의 인자만 전달할 수 있습니다.
  2. imap() 함수
    • 작업을 하나씩 실행하고, 작업 결과가 사용 가능한 순서대로 반환됩니다.
    • imap()은 map() 함수와 달리 작업이 완료될 때까지 기다리지 않고, 사용 가능한 결과가 있으면 바로 반환합니다.
    • 각 작업에는 하나의 인자만 전달할 수 있습니다.
  3. starmap() 함수
    • starmap() 함수는 map() 함수와 유사하지만, 각 작업에 여러 개의 인자를 전달할 수 있습니다.
    • 각 작업에 튜플로 묶인 인자를 전달하여 병렬 처리를 합니다.