IT/프로그래밍

[파이썬] multiprocessing 모듈 사용법 [패스트 캠퍼스 챌린지 49일]

뜻밖의 행복 2022. 3. 13. 20:38
반응형

안녕하세요? 뜻밖의 행운입니다.

오늘로 패스트 캠퍼스 도전 49일

내일이 마지막이네요 강의는 무진장 많이 남았지만

도전은 도전대로 끝내고 저는 끝까지 쭈욱 강의 잘 듣겠습니다.

계속해서 동시성과 병렬성 

파이썬 멀티프로세싱 오늘 배운 내용 정리해보도록 하겠습니다.

 

 

오늘도 따로 이론은 없었고 실습만 있었습니다. 

아래 3가지 실습으로 멀티 프로세스 모듈이 어떻게 동작하는지 알아봤습니다.

 

import multiprocessing as mp

# 프로세스에서 실행할 함수
def sub_process(name):
    print("[sub] start")
    print(name)
    cp = mp.current_process()
    print(f"[sub] pid : {cp.pid}")
    print("[sub] end")


# 메인 프로세스
if __name__ == "__main__":
    print("[main] start")
    p = mp.Process(target=sub_process, args=('startcoding',))
    p.start()
    cp = mp.current_process()
    print(f"[main] pid : {cp.pid}")
    print("[main] end")

사용방법 자체는 간단합니다. 

또 멀티프레세싱 모듈을 임포트 하고 

그냥 호출해서 사용하면 됩니다. 

다만 이것을 어떻게 잘 사용할지가 늘 문제지요 

 

이중에서 왜? 이렇게 써야 하지 이해가 안되는 부분인데

 

 if __name__ == "__main__" 사용하는 이유 
 https://docs.python.org/2/library/multiprocessing.html#multiprocessing-programming

 

내용이 너무 길어서 위 사이트의 내용을 참고하여 공부하라고 하는데

천천히 한번 봐야겠네요

 

출력값

[main] start
[main] pid : 33052
[main] end        
[sub] start
startcoding
[sub] pid : 18464   
[sub] end

 

pid의 경우는 실행할때마다 계속 해서 변경될 수 있는 부분입니다.

 

메인이 먼저 실행되고 

끝난 뒤에 서브가 실행되고 끝나는것이 보입니다.

사실 전 시간에 이것을 방지하기 위해서 join을 썼던 기억이 나는데 

아니나 다를까 바로 다음 실습에서 해당 내용에 대해 다루더라구요

from multiprocessing import Process
import time

class Subprocess(Process):
    
    def __init__(self, name):
        Process.__init__(self)
        self.name = name

    def run(self):
        print(f"[sub] {self.name} start")
        time.sleep(5)
        print(f"[sub] {self.name} end")

if __name__ == "__main__":
    print("[main] start")
    p = Subprocess(name='startcoding')
    p.start()
    p.join()
    print("[main] end")

실행시키면 아래와 같은 결과가 떨어집니다.

 

[main] start
[sub] startcoding start
[sub] startcoding end
[main] end

 

이번에는 join을 사용해서 main이 먼저 끝나지 않고 sub 가 끝날때까지 기다렸다가

함께 잘 끝나는 것이 보입니다.

 

 

from multiprocessing import Process
import time

class Subprocess(Process):
    
    def __init__(self, name):
        Process.__init__(self)
        self.name = name

    def run(self):
        print(f"[sub] {self.name} start")
        time.sleep(5)
        print(f"[sub] {self.name} end")

if __name__ == "__main__":
    print("[main] start")
    p = Subprocess(name='startcoding')
    p.start()
    time.sleep(1)
    # 프로세스가 살아있는지 검사
    if p.is_alive:
        p.terminate()

    print("[main] end")

 

[main] start
[sub] startcoding start
[main] end

 

여기서는 

    if p.is_alive:

       p.terminate()

이 기능이 추가되었는데요 
이것은 그냥 매서드 이름에서도 보이듯이 해당 프로세스가 살아 있는지 체크하고 
살아 있다면 종료 시키는 기능입니다. 
보면 sub end가 안찍히고 바로 main end가 되는것이 보이지요?

 

반응형