[Python] 간단한 프로그램 Multiprocessing 만들기

2023. 3. 7. 12:21Developers 공간 [Shorts]/Software Basic

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

간단한 프로그램을 아래와 같이 만들었는데, 파이썬은 기본적으로 CPU process 하나를 기준으로 돌아갑니다.

 

import os
import re

Folders = ['/mnt/abc/1', '/mnt/abc/2' , ... '/mnt/abc/999999']
My_Path = '/mnt/my_folder'

def main():
    for folder in Folders :
        for file in os.listdir(folder):
            name = re.split("[_\-]", one_file)[3]
            os.path.join(My_Path, name)
        
if __name__ == '__main__':
	main()

 

따라서 간단한 폴더구조를 만들거나, RPA(Robotic Process Automation) 작업 중, 반복문을 활용한 작업은 single process로는 시간이 오래걸립니다.


2. Why? (원인)

  • For loop의 병렬성을 CPU에서 높히는 간단한 방법은 Multiprocessing 입니다.
    • 간단한 수학적 작업의 경우, 기존에 잘 구현된 numpy를 활용해 개선하거나
    • 원하는 for loop를 multiprocessing 라이브러리를 활용해 개선할 수 있습니다.

3. How? (해결책)

  • 위 코드를 multiprocessing Pool을 사용해 아래와 같이 구현했습니다.
    • process 개수는 default를 사용하셔도되고, 직접 bash에서 얻어낸 "echo $(nproc)"  값을 넣어주어도 됩니다
    • 주의할 점은 공유 자원에 대한 race가 발생하지 않아야한다는 점입니다.
      • 아래 process() 함수 내에
        lock = multiprocessing.Lock()
        lock.acquire()
        lock.release()
        와 같이 구현할 수 있기는 합니다
      • 다만, 제가 실험했을 때는 이유는 파악하지 못했지만 race가 발생하는 경우가 많아 지양하고 있습니다.
import os
import re
import multiprocesing import Pool

Folders = ['/mnt/abc/1', '/mnt/abc/2' , ... '/mnt/abc/999999']
My_Path = '/mnt/my_folder'

def process(folder):
    for file in os.listdir(folder):
        name = re.split("[_\-]", one_file)[3]
        os.path.join(My_Path, name)
def main():
	pool = Pool(processes=5)
    pool.map(process, Folders)
        
if __name__ == '__main__':
	main()

 


https://mizykk.tistory.com/62

728x90
반응형