파이썬 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]

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)