히비스서커스의 블로그

[Python] python으로 multiprocessing 해보기 본문

Programming/Python

[Python] python으로 multiprocessing 해보기

HibisCircus 2021. 6. 30. 01:36
728x90

패치작업을 하다보니 하나의 주피터 노트북 파일로 실행을 하려다보니 너무나 오래걸림을 깨달았다. 이럴 때 py파일로 multiprocessing을 하여 병렬처리하는 것이 더 효율적이란 것을 알게 되었고 공부하며 한 번 정리해보았다.

 

multiprocessing

 

multiprocessing 모듈은 threading 모듈과 유사한 API를 사용하여 process spawning(OS가 다른 프로세스의 요청에 의해 자식 프로세스를 생성하는 기술)을 지원한다. multiprocessing package는 local과 원격 동시성을 모두 제공하며 thread 대신 subprocess를 사용하여 global interpreter lock(한 번에 오직 하나의 thread가 파이썬 byte code를 실행하도록 보장하기 위해 CPython 인터프리터가 사용하는 메커니즘)을 효과적으로 피한다. 유닉스 기반과 윈도우 기반 모두에서 실행이 가능하며 주어진 서버나 컴퓨터의 multiprocessor를 최대한 활용할 수 있게 해준다.

 

API의 내용을 가져오니 전문용어가 다소 어렵게 느껴지지만 내가 사용할 부분은 Process를 분산처리 한다는 것 하나이다. 패치를 만드는 코드가 아닌 erode를 진행하는 코드를 가상으로 예시로 들며 어떻게 분산처리를 하는지 기록해두었다.

 

 

 

라이브러리

import multiprocessing
import glob
import cv2

 

첫번째 줄은 multiprocessing 모듈을 불러온다. 이번에 쓸 부분은 Process 메서드이다.

 

두번째 줄은 glob 모듈을 불러와 파일경로들을 리스트 형태로 불러들여 for문을 통해 하나씩 넣어주기 위함이다.

 

세번째 줄은 opencv로 이미지를 읽어들여 모폴로지 연산 후 저장하기 위함이다.

 

 

 

함수

def erode_save(input_path, save_path):
	image = cv2.cv2Color(cv2.imread(input_path), cv2.COLOR_BGR2GRAY)
	kernel = cv2.getStructureingElement(cv2.MORTH_RECT, (5,5))
	erode_image = cv2.erode(image, kernel, iterations=1)
	image_name = input_path[-8:-4]
	cv2.imwrite(save_path + f'{image_name}_erode.png', erode_image)


 

입력경로와 저장경로를 넣어주면 자동으로 입력 경로의 이미지에 대해 erode(침식)을 해준 후 저장해주는 함수이다.

 

첫째 줄에서는 이미지를 불러들이고 컬러이미지를 흑백이미지로 전환해준다.

 

둘째 줄에서는 침식을 적용해줄 때의 파라미터를 미리 지정해준다.

 

셋째 줄에서는 읽어들인 이미지에 대해서 파라미터를 적용해주어 침식을 적용해준다.

 

넷째 줄에서는 경로에서 파일명만 추출한다. (예시경로. ~/image/0001.png)

 

다섯째 줄에서는 erode된 이미지를 저장 경로에 저장한다. 이때 이미지 명은 기존의 이름에 _erode를 붙여주도록 한 것이다.

 

 

 

실행

if __name__=='__main__':
    save_path = '~/opencv/'
    for input_path in sorted(glob.glob('~/image/*.png'))
    	p = multiprocessing.Process(target=erode_save, args=(input_path, save_path,))
        p.start()

 

첫번째 줄은 파일을 직접 실행할 때만 아래의 내용을 실행하라는 뜻이다.

 

두번째 줄은 erode_save에 들어갈 경로를 지정한다.

 

세번째 줄은 불러들일 여러 경로들을 정렬하여 하나씩 불러오게 한다.

 

네번째 줄은 multiprocessing의 Process 메서드를 사용하여 Process 객체를 만드는 부분이다. 여기서, target에는 병렬처리할 함수를 집어 넣고 args에는 함수에 인자에 해당하는 값들을 넣어준다. 특징으로는 , 를 하나 해주어 여백의 미를 남겨준다.

 

다섯번째 줄은 만든 Process 객체를 start() 메서드를 호출하여 spawn한다.

 

이를 통하여 병렬처리를 실행할 수 있다.

 

 

 

마지막으로 병렬처리가 잘 진행되는지 확인하려면 터미널에서 

$ htop

 

 

다음의 명령어를 주면

 

위와 같이 cpu와 ram의 사용량을 확인할 수 있다. 병렬처리가 잘 이루어졌다면 위의 이미지를 예시로 16까지의 게이지가 풀(= 100%)로 차며 진행이 된다!

 

 

 

-히비스서커스-

728x90