[Python] 간단한 프로그램 Multiprocessing 만들기
2023. 3. 7. 12:21ㆍDevelopers 공간 [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가 발생하는 경우가 많아 지양하고 있습니다.
- 아래 process() 함수 내에
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()
728x90
반응형
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[Jupyter] Notebook 원격에서 작업하기 (0) | 2023.04.15 |
---|---|
[Git] Git Pull 시 need to specify how to reconcile them (0) | 2023.03.19 |
[Bash] Process 실행 후에 시간이 지난 후 진행이 안될 때 (0) | 2023.03.07 |
[CMake] 기초 템플릿 (0) | 2023.03.01 |
[ShellScript] 기초 템플릿 (0) | 2023.02.28 |