본문 바로가기

Data/Python

[Python] multiprocessing 작업시 배열 공유 방법

반응형

import psutil
import os
import time
from multiprocessing import Process, Pool

shared_list = [1,2,3,4,5]

def count_step(temp):
    p = psutil.Process(os.getpid())
    time.sleep(shared_list.pop(0))
    print(shared_list)

num_cores = 5
pool = Pool(processes=num_cores)
pool.map(count_step, shared_list)
pool.close()
pool.join()
print("DONE")

이번에 python으로 코딩하면서 Multiprocessing을 활용해야하는 일이 생겼다. 작업과정중에 특정 배열을 모든 프로세스에서 사용할수 있도록 해야했었는데 생각보다 쉽지가 않았다.

 

보통은 그냥 아래처럼 shared_list를 전역변수로 선언해서 작업을 하면 되겠지 라고 생각했는데

sleep을 아무리 해도 뭔가 배열이 공유가 안되는 느낌이였다

오랜시간동안 검색을 해보니 다음과 같은 사이트를 발견했고 똑같이 따라해보았다

https://blog.ruanbekker.com/blog/2019/02/19/sharing-global-variables-in-python-using-multiprocessing/

 

Sharing Global Variables in Python Using Multiprocessing - Ruan Bekker's Blog

While I was using multiprocessing, I found out that global variables are not shared between processes. Example of the Issue Let me first provide an example of the issue that I was facing. I have 2 input lists, which 2 processes wil read from and append the

blog.ruanbekker.com

 

수정된 코드는 다음과같다

import psutil
import os
import time

shared_list = []

def count_step(temp):
    p = psutil.Process(os.getpid())
    time.sleep(temp[0])
    print(temp[1], temp[2], os.getpid(), p.name(), p.cmdline())
    shared_list.append(temp[1])
    print(shared_list)

num_cores = 5
pool = Pool(processes=num_cores)
pool.map(count_step, parameter)
pool.close()
pool.join()
print("DONE")

출력결과는 내가 원하는대로 하나의 배열이 실행되는 프로세스에 다 공유되는것을 확인할수있었다.

반응형