파이썬 multiprocessing에 대한 질문입니다..
조회수 2570회
a=[1,2,3,4,5]
b=[]
for c in a:
b.append(c)
print(b) # 출력은 [1,2,3,4,5]
위 코드를 multiprocessing 이용해 빠르게 실행시키려고 하는데요..
from multiprocessing import Pool
a=[1,2,3,4,5]
def abc(a):
b=[]
b.append(a)
print(b)
if __name__=='__main__':
pool = Pool(processes=6)
pool.map(abc,a)
이렇게 바꾸면 출력값이 [1,2,3,4,5]가 되지 않고 [1] [2] [3] [4] [5] 가 됩니다.
for문을 이용할때는 b라는 공리스트를 반복문 밖으로 빼서 반복될때마다 기존의 b라는 리스트에 더할 수 있었는데
multiprocessing을 이용하려니 b라는 공집합을 abc(a)라는 함수 밖으로 뺄수가 없어서 고민입니다.
multiprocessing을 쓰면서 출력은 맨 위 코드처럼 나오게 할 수 있는 방법이 있을까요??
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
multiprocessing 모듈은 사용하기 쉬운 모듈은 아닙니다.
multiprocessing 이라는 것 부터가 쉬운 주제가 아니기도 하고요.
일반 파이썬 프로그래밍 하듯이 하면 안됩니다.
map 을 사용했으니 a의 요소들을 인자로 5개의 프로세스를 만들어서 작업을 분할하여 작업합니다.
즉 1을 보내고 b 리스트에 하나를 추가하고 출력 이런식으로 5번을 반복하니 각 리스트로 [1] [2] [3] [4] [5] 와 같이 나오게 됩니다.
원하는 작업을 하려면 공유 메모리를 이용해야 합니다.
문제는 공유메모리에서 사용할 수 있는 데이터 타입이 c 터입으로 한정되어 있기 때문에 기본적으로 제공되는 것은 Value 와 Array 뿐입니다.
물론 C언어 지식이 있다면 ctypes 모듈을 사용해서 다양하게 확장할 수 있습니다.
아래의 예제를 보시고 참고하시고 https://docs.python.org/3.7/library/multiprocessing.html?highlight=process#sharing-state-between-processes
상기 링크의 문서를 숙지하시기 바랍니다.
from multiprocessing import Pool, Array a=[1,2,3,4,5] def abc(a): arr[a - 1] = a if __name__=='__main__': arr = Array('i', 5) # multiprocessing.sharedctypes.c_int_Array_5 c의 int 5개를 담을 수 있는 array pool = Pool(processes=6) pool.map(abc, a) print(arr[:]) [1, 2, 3, 4, 5]
[1] [2] [3] [4] [5]
댓글 입력