python에서 간단한 계산 수행 용 multiprocessing에 대해 질문 드립니다


아래의 코드는 질문과 관련한 내용을 요약해서(?) 써본 것입니다.

아래코드에서는 지나치게 간략화 되었지만ㅜㅜ 각 프로세스들이 접근하는 결과값 행렬 M의 위치는 다릅니다. (프로세스들이 다 다른 M[행][열] 위치에 값을 쓰게 하려 합니다.)

이때 프로세스에서 변수 M을 복사해서? id(M)값을 다르게 가져가다보니 행렬 요소의 값이 변하지 않습니다. 전역변수로 선언도 해보았지만 해결이 안되네요ㅜㅠ queue를 사용하는 방법은 너무 느려서 유보하였습니다.

프로세스들이 전역변수의 메모리 주소를 그대로 가져가게 하거나 또는 다른 방식으로 결과값을 가져올 방법이 없을까요..?

감사합니다.

from multiprocessing import Process
import numpy
def main():
    mother()
def mother():
    PROCESS_NUM = 4

    M = numpy.array((3)) # 아웃풋을 쓸 변수
    element = [30, 40, 50, 60]

    for i in range(3):
        PROCESS_LIST = []

        for i in range(PROCESS_NUM):
            p = Process(target = pF_mother,  args = (
                    element[i], M,))
            PROCESS_LIST.append(p)
            PROCESS_LIST[i].start()

        for i in range(PROCESS_NUM):
            PROCESS_LIST[i].join()

    return M
def pF_mother(elt, output):
    output = elt

    return output
if __name__ == "__main__":
    main()
  • 2016년 07월 08일에 작성됨

조회수 287


1 답변


여러개의 프로세스가 서로 통신하기 위해서는 Shared memory를 사용하셔야 합니다.

가장 간단한 예인 Value를 사용하는 예만 설명 드릴게요.

  • num = Value('d', 0.0)와 같이 선언하면 됩니다.

Value뒤에 나오는 'd'는 double precision float를 의미합니다. 정수로 쓰고 싶으시면 'i'라고 적어 주시면 됩니다.

아래 예제는 두개의 프로세스가 각각 shared memory에 적힌 값을 읽어와서 1씩 증가시키고 결과로는 2가 출력됩니다.

from multiprocessing import Process, Value, Array

def f(n):
    n.value = n.value + 1

num = Value('d', 0.0)

p1 = Process(target=f, args=(num,))
p2 = Process(target=f, args=(num,))
p1.start()
p2.start()
p1.join()
p2.join()

print(num.value)

Value말고 Array를 사용하는 방법은 여기서 확인하세요.

  • 2016년 07월 12일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close