본문 바로가기
Study/Python

Python MultiProcess Shared Object

by Becoming a Hacker 2024. 5. 29.
반응형

Python의 MultiProcess는 프로세스마다 독립적인 메모리를 가지고 있어, 아래와 같이 예상치 못한 결과를 받는 경우가 있다.

- 원했던 결과 : 1 -> 2

import multiprocessing

class a:
    def __init__(self):
        self.classb = b()
        mp1 = multiprocessing.Process(target=self.mp_start, args=())
        mp1.start()
        mp2 = multiprocessing.Process(target=self.mp_start, args=())
        mp2.start()
        mp1.join()
        mp2.join()

    def mp_start(self):
        self.classb.a()

class b:
    def __init__(self):
        self.result = {'a': 1}
    
    def a(self):
        print(self.result['a'])
        self.result['a'] += 1

if __name__ == "__main__":
    a()
    # 1 -> 1

 

만약 특정 Object를 공유하고 싶다면, MultiProcess Manager를 사용하면 된다.

import multiprocessing

class a:
    def __init__(self, shared_dict):
        self.classb = b(shared_dict)
        mp1 = multiprocessing.Process(target=self.mp_start, args=())
        mp1.start()
        mp2 = multiprocessing.Process(target=self.mp_start, args=())
        mp2.start()
        mp1.join()
        mp2.join()

    def mp_start(self):
        self.classb.a()

class b:
    def __init__(self, shared_dict):
        self.result = shared_dict
    
    def a(self):
        print(self.result['a'])
        self.result['a'] += 1

if __name__ == "__main__":
    manager = multiprocessing.Manager()
    shared_dict = manager.dict({'a': 1})
    a_instance = a(shared_dict)
    # 1 -> 2

 

반응형

댓글