이번에는 각 프로세스의 결괏값들을 합쳐 멀티 프로세싱 이후 다른 작업을 해보도록 하자.
기본 멀티프로세싱 코드는 이전에 작성한 포스트에서 확인 가능하다:)
2022.07.28 - [IT/python] - [python] joblib을 이용하여 멀티프로세싱(multi processing) 적용하기
분명 저장하는 방법이 있을 거 같은데 구글링 해도 전부 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에서 발견!!!
다른 방법으로도 결괏값 저장할 수도 있을 거 같은데 필자는 이 방법으로 성공해서 이렇게만 작성하고 있다.
혹시 다른 방법이 있다면 댓글로 알려주세요:)
반응형