이번에는 각 프로세스의 결괏값들을 합쳐 멀티 프로세싱 이후 다른 작업을 해보도록 하자.
기본 멀티프로세싱 코드는 이전에 작성한 포스트에서 확인 가능하다:)
2022.07.28 - [IT/python] - [python] joblib을 이용하여 멀티프로세싱(multi processing) 적용하기
[python] joblib을 이용하여 멀티프로세싱(multi processing) 적용하기
오늘은 joblib 라이브러리로 멀티프로세싱 하는 방법을 알아보자. 멀티프로세싱 예제 코드를 검색하면 대부분 import multiprocessing로 작성하는 예제가 나오는데 필자는 joblib으로 코드를 익혀서
hyang2data.tistory.com
분명 저장하는 방법이 있을 거 같은데 구글링 해도 전부 import multiprocessing에서 하는 방법이여서 많이 헤맸다 ㅠㅠ (multiprocessing 라이브러리로 바꾸는 시도도 했었는데 그것도 실패한 건 비밀..)
성공하고 나니 생각보다 간단해서 허무했다 ㅎㅎ//
from joblib import Parallel, delayed
import os
# multi processing option
USE_MULTIPROCESS = True
def make_filelist(filepath, savelist): <<<<<<<<<< savelist 추가
# 병렬로 처리하고자 하는 작업 (예시)
newname = filepath.replace(r'sicu', 'micu')
os.rename(filepath, newname)
savelist.add(newname) <<<<<<<<<< savelist 저장
if __name__ == '__main__':
global savelist <<<<<<<<<< savelist 전역변수 선언
savelist = set()
# 처리하고자 하는 전체 데이터를 list(혹은 set)로 불러오기 (예시)
todo_path_list = set()
for rootdir, dirs, files in os.walk(FILES_DIR):
for filename in files:
if filename.endswith('.vital'):
todo_path_list.add(os.path.join(rootdir, filename))
# multi process를 사용하는 경우
if USE_MULTIPROCESS:
Parallel(os.cpu_count(), backend='threading')(delayed(make_filelist)(filepath, savelist) for filepath in todo_path_list) <<<<<<<<<< backend='threading', savelist 추가
# multi process를 사용하지 않을 경우
else:
for filepath in todo_path_list: make_filelist(filepath, savelist) <<<<<<<<<< savelist 추가
# 멀티프로세싱 이후 작업 (예시)
for name in setlist:
print(name)
기존 멀티프로세싱 코드에서 결괏값 저장하기 위한 부분은 <<<<<<<<<<<로 강조했으니 선택적으로 참고하면 될 듯 하다 ㅎㅎㅎ
핵심 키워드는 Parallel 메소드 내에 backend='threading' 이 부분인데 이런 파라미터가 있는 줄도 몰랐다가 stack overflow에서 발견!!!
다른 방법으로도 결괏값 저장할 수도 있을 거 같은데 필자는 이 방법으로 성공해서 이렇게만 작성하고 있다.
혹시 다른 방법이 있다면 댓글로 알려주세요:)