본문 바로가기

Python/Advanced

[Python] Multiprocessing(4) - Sharing state

멀티 프로세스 자원공유(Value 방식) 샘플 코드

 

# 프로세스 동기화(공유)
# 값을 하나만 공유할때-Value, 리스트타입으로 공유할때-Array
from multiprocessing import Process, current_process, Value, Array
import random
import os

# 프로세스 메모리 공유 예제(공유 O)

# 프로세스 동기화 관련 참고
# https://docs.python.org/3/library/multiprocessing.html#synchronization-between-processes


# 실행 함수
def generate_update_number(v : int):
    with v.get_lock(): # lock 을 이용한 자료 공유
        for i in range(50):
            v.value += 1
    print(current_process().name, "data: ", v.value)

def main():
    # 부모 프로세스 아이디
    parent_process_id = os.getpid()
    # 출력
    print(f"Parent process ID {parent_process_id}")

    # 프로세스 리스트  선언
    processes = list()

    # 프로세스 메모리 공유 변수
    # from multiprocessing import shared_memory 사용 가능(파이썬 3.8)
    # from multiprocessing import Manager 사용 가능
    # https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes
    # (Manager 사용 가능)
        
    # share_numbers = Array('i', range(50)) # i(int), c(char), f(float), l(long) 등 Flag 확인
    share_value = Value('i', 0)
    for k in range(1,10):
        # 생성
        p = Process(name='변수공유_'+str(k).zfill(2), target=generate_update_number, args=(share_value,))
        # 배열에 담기
        processes.append(p)
        # 실행
        p.start()
        
    # Join
    for p in processes:
        p.join()

    # 최종 프로세스 부모 변수 확인
    print("Final Data(share_value) in parent process",  share_value.value)

if __name__ == '__main__':
    main()