Python/Study

python 기초 - multiprocessing

pybi 2023. 1. 16. 22:45

이번편은 파이썬의 process에 대한 내용이다. 아래 process를 실행하면 process name과 id 값을 알 수 있고 id는 계속 실행하면 바뀌는 것을 확인할 수 있다.

import multiprocessing as mp

def Process():
    proc = mp.current_process()
    print(proc.name)
    print(proc.pid)
    
Process()
MainProcess
1136
MainProcess
5936

 

 

이번에는 Subprocess라는 이름을 가진 process를 만들고 해당 process를 통해 Process_start라는 함수를 실행시켜 보자. Subprocess id도 확인이 가능하다.

import multiprocessing as mp
import time

def Process():
    proc = mp.current_process()
    print(proc.name)
    print(proc.pid)
    print("SubProcess End")
    time.sleep(1)

if __name__ == "__main__":
    proc = mp.current_process()
    print(proc.name)
    print(proc.pid)
    p = mp.Process(name="SubProcess", target=Process)
    p.start()
    time.sleep(5)
    print("MainProcess End")
MainProcess
8684
SubProcess
12096
SubProcess End
MainProcess End

 

 

이번에는 process를 생성하고 pool을 통해 병렬처리를 시켜보자. 아래 Pool(2)는 2개씩 병렬처리 한다는 뜻이다. 아래 파일을 실행시키면 함수가 2개씩 병렬 처리되는 것을 알 수 있고(결과의 pip를 보면 더 이해하기 쉽다) 이 값을 올리면 더 많은 함수가 병렬 처리된다. 

from multiprocessing import Pool
import time
import os

def pool_test(value):
    print(value, "pid : ", os.getpid())
    time.sleep(1)

if __name__ == "__main__":
    pool = Pool(2)
    data = range(1, 10)
    pool.map(pool_test, data)
    pool.close()
    pool.join()
1 pid :  5184
3 pid :  8844
4 pid :  8844
2 pid :  5184
5 pid :  5184
7 pid :  8844
6 pid :  5184
8 pid :  8844
9 pid :  8844

 

 

아래처럼 class에서도 multiprocess 수행이 가능하고 args를 통해 여러 인자또한 전달할 수 있다. 또한 is_alive()를 통해 process의 status가 True인지 False인지 확인이 가능하다. 처음 process를 수행시켰을떄는 True이지만 join 이후 process가 종료된 뒤에는 False로 출력되는 것을 확인할 수 있다.

import multiprocessing as mp
import os
import time

class Process_test:
    def __init__(self):
        pass 

    def run(self, *value):
        for i in value:
            pname = mp.current_process().name
            print(pname, os.getpid(), i)
            time.sleep(1)

if __name__ == "__main__":
    w = Process_test()
    p = mp.Process(name="Sub Process", target=w.run, args=("args1", "args2"))
    p.start()
    print("process status : ", p.is_alive())
    p.join()
    print("Main Process End")
    print("process status : ", p.is_alive())
process status :  True
Sub Process 10676 args1
Sub Process 10676 args2
Main Process End
process status :  False

 

 

실행 중인 process는 강제로 죽일수도 있다. 어떻게 하는지는 자고 일어나서 내일 적어야지...