Python Multiprocessing(Process)을 사용한 데이터 처리 속도 개선
· Version : MAC OS, Python 3.X, PIP3
대용량 데이터를 효율적으로 처리하기 위해서는 병렬 처리를 활용하는것이 좋다. 파이썬에서 병렬처리를 제공하는 대표적인 라이브러리는 Threading과 Multiprocessing 모듈이다. Threading 모들은 파이썬의 GIL(Global Interpreter Lock)라는불리우는 잠금 모델을 사용하기 때문에I/O 작업이 아닌 CPU 작업이 많을 경우 오히려 성능이 저하된다. 이 방식은 Lock을 풀고 스레드를 교환하고 다시 Lock을 거는 형태의 멀티스레드이기 떄문이다.
파이썬에서는 Multiprocessing 를 권장하고 있으며, 이 모듈에는 대표적으로 Pool과 Process가 있지만 이번 글에서는 Process에 대해서 다루기로 한다.
· Pool 을 사용한 처리 속도 개선 : https://sungwookkang.com/1478
Process는 하나의 프로세스에 하나의 함수를 할당하여 실행한다. Target= 파라메터에 작업을 할당하고, args=(agr1, )에 인수를 할당하여 프로세스 객체를 생성한다. start() 로 프로세스를 시작하여 join()으로 프로세스의 종료를 기다린다.
import os import multiprocessing as mp from multiprocessing import Pool, Process import threading import time import datetime
def multiprocess(): start = int(time.time())
ojbect_list = [] for i in range(1,12): task = Process(target=work_func, args=(i,)) ojbect_list.append(task) task.start()
for task in ojbect_list: task.join()
end = int(time.time()) print("***run time(sec) : ", end-start)
print("Number of Core : " + str(mp.cpu_count()))
def work_func(x): print("time : " + str(datetime.datetime.today()) + " value :" + str(x) + " PID : " + str(os.getpid()))
if __name__ == '__main__': # execute only if run as a script
multiprocess()
|
위 코드를 실행한 결과를 살펴보면 각 실행마다 다른 프로세스(PID가 각각 다름)에서 실행된것을 알 수 있다.
Pool과 Process 차이점은, Pool의 경우 실행되어야 할 작업이 코어수 만큼 분할되고 각 코어수 만큼 프로세스가 생성되어 힐당받은 작업을 처리하는데, Process의 경우 각 작업마다 새로운 프로세스가 할당되어 작업을 처리한다.
2021-03-02/ Sungwook Kang / http://sungwookkang.com
파이선, 파이썬, python, 병렬처리, Multiprocessing, Python Multiprocessing, 파이썬 병렬처리, 데이터 처리, Data Processing
'SW Engineering > 머신러닝 딥러닝' 카테고리의 다른 글
Python Multiprocessing(Pool)을 사용한 데이터 처리 속도 개선 (0) | 2021.03.02 |
---|---|
Python에서 Yahoo 주식 데이터 가져오기 (0) | 2020.12.29 |
Python에서 Tesseract 사용하기 (0) | 2020.12.19 |
Tesseract를 활용한 이미지 속 문자인식 (0) | 2020.12.18 |
과대적합(Over fitting)과 과소적합(Under fitting) (0) | 2020.03.19 |