파이썬 멀티 프로세스 공유 메모리 설정 ( Manager )

2023. 4. 7. 07:59it

반응형

0. Python Multi-processing Manager 란

Manager 객체는 multiprocessing 모듈에서 제공하는 메모리 공유 기능을 사용하기 위한 클래스입니다. Manager 객체는 프로세스 간에 데이터를 공유하기 위한 Proxy 객체를 생성하고, 이 객체를 통해 프로세스 간의 데이터를 동기화합니다. Manager 객체는 다음과 같은 자료구조를 생성할 수 있습니다.

- 공유 리스트 (list)
- 공유 딕셔너리 (dict)
- 공유 세트 (set)
- 공유 카운터 (Value)
- 공유 배열 (Array)
- 공유 네임드 튜플 (Namespace)
- 공유 큐 (Queue)


위 자료구조들은 Manager 객체를 사용하여 생성되므로, 프로세스 간에 공유될 수 있습니다. 이를 통해 멀티프로세싱 환경에서도 안전하게 데이터를 공유할 수 있습니다.

Manager 객체는 내부적으로 multiprocessing 모듈에서 제공하는 IPC(Inter-Process Communication) 기법을 사용하여 프로세스 간에 데이터를 공유합니다. 이를 통해 프로세스 간의 동기화와 데이터 일관성을 유지할 수 있습니다. 다만, Manager 객체를 사용하면 프로세스 간의 데이터 교환에 대한 부하가 있기 때문에, 단일 프로세스에서 실행하는 것보다 성능이 좀 떨어질 수 있습니다.

 

2. 기본 문법

반응형
import multiprocessing

if __name__ == '__main__':
    # Manager 객체를 생성합니다.
    manager = multiprocessing.Manager()

    # 공유 리스트를 생성합니다.
    shared_list = manager.list()

    # 공유 딕셔너리를 생성합니다.
    shared_dict = manager.dict()

    # 공유 큐를 생성합니다.
    shared_queue = manager.Queue()

 

3. Manager 예제

728x90
import multiprocessing

def worker(shared_list, process_index):
    for i in range(5):
        shared_list.append(f"Process {process_index}: {i}")

if __name__ == '__main__':
    # Manager 객체를 생성합니다.
    manager = multiprocessing.Manager()

    # 공유 리스트를 생성합니다.
    shared_list = manager.list()

    # 프로세스를 생성하고 실행합니다.
    processes = []
    for i in range(3):
        p = multiprocessing.Process(target=worker, args=(shared_list, i))
        processes.append(p)
        p.start()

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

    # 결과를 출력합니다.
    print(f"Final result: {shared_list}")

 

4. 결과

Final result: ['Process 0: 0', 'Process 0: 1', 'Process 0: 2', 'Process 0: 3', 'Process 0: 4', 'Process 1: 0', 'Process 1: 1', 'Process 1: 2', 'Process 1: 3', 'Process 1: 4', 'Process 2: 0', 'Process 2: 1', 'Process 2: 2', 'Process 2: 3', 'Process 2: 4']
반응형