파이썬 항상 병렬적으로 계속 실행되는 함수 코딩법 질문입니다..(멀트프로세싱)

조회수 2165회

안녕하세요 파이썬 코딩중인데.. 혼자서 찾아보며 여러 시행착오 겪어가며 코딩해봐도 안풀리는 일이 있어서 질문합니다..

from time import sleep
from multiprocessing import Process


def append0():
    global result
    while True:
        result.append('0')


def append1(): 
    global result2

    while True: 
        result2.append('1')

if __name__ == '__main__': 
    result2 = []
    result = []
    result.append('0')
    result2.append('1')
    p1 = Process(target=append0)
    p2 = Process(target=append1)
    p1.start()
    p2.start()
    sleep(3)
    print(result)
    print(result2)
    p1.join()
    p2.join()

일단 제가 원하는건, main함수는 main함수대로 진행되면서 다른 두 개의 함수가 이와는 병렬적으로 항상 실행되고 있어야 하는 구조입니다. 그래서 multiprocessing을 이용해야 한다 생각하구요.

일단, 심플하게 코드구조가 잘 돌아가는지 보려고 위와 같이 테스트하고 있는데요... 이 코드에서는, 제가 원하는건 def append0이랑 def append1 이 두함수가 계속 실행되어서 각각 result랑 result2에 '0'과 '1'을 계속 추가시켜야합니다. 이 동안에 계속 main함수는 돌아가구있어야하구요.. 그래서 위와 같이 코딩을했는데,, 저의 원하는대로 실행됬으면, main함수가 3초동안 sleep할동안에 append0과 append1함수에 의해 result와 result2에 '0'과 '1'이 맣이 넣어질것으로 생각했는데, 결과 창에 print되는건 main함수에서 첨에 넣어줘서 생겼던 ['0'] ['1'] 하나씩만 나오네요 ㅠ 그래서 append함수들이 실행안되고있는것 같은데,

어떻게해야할까요..

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 파이썬이 GIL 이라는 유물 때문에 참 골치가 아픕니다.

    옛날같이 코어가 1개인 cpu에서야 GIL 구조가 성능적으로 이득이 됩니다만 지금은 멀티코어가 기본인 세상인데...python 3에서 GIL 제거를 하려고 했었습니다만 여러이유로 제거는 못했습니다...결국 우회하는 방법을 택했고 그 결과가 multiprocessing 모듈 도입이라고 봐도 무방할겁니다.

    각설하고...질문의 이유를 이해하려면 프로세스라는 것을 이해해야 합니다.

    각각의 프로세스는 독립적인 메모리 공간을 갖습니다. 32비트 운영체제에서는 프로세스는 각각 4GB의 메모리를 할당 받고 독립적인으로 운용됩니다 즉 서로의 프로세스는 서로 메모리에 침범 할 수도 없습니다.

    자 여기까지 개념을 넣고 위의 코드를 보세요. 두개의 프로세스를 더 만들었습니다. 즉 위의 코드는 1개의 메인 프로세스에 2개의 포크된 프로세스가 만들어 졌습니다.

    문제는 프로세스는 각각 독립적이기 때문에 각 포크된 프로세스에서 생성한 result 에 (main에서) 접근 할 수가 없습니다.

    그럼 변수 전송 혹은 공유를 어떤식으로 할 수 있는가?

    전송은 Queue 와 pipe 를 이용해서 IPC 를 할 수 있고 변수의 공유는 주로 공유 메모리를 사용합니다.

    https://docs.python.org/3.7/library/multiprocessing.html

    도움말에서 Exchanging objects between processes, Sharing state between processes 을 먼저 읽어보시기 바랍니다.

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

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

(ಠ_ಠ)
(ಠ‿ಠ)