공장의 여러 tag들로 데이터를 한꺼번에 긁어와야 할 일이 생겼다.
문제는, tag 갯수가 많은데 함수가 list를 받아들이지 못해 for문으로 일일히 데이터를 받아와야 하는 상황이 생겼다.
시간을 단축시키는 일이 중요한 업무인지라 이를 병렬로 실행시키는 방법을 알아보게 되었다.
원리를 쉽게 설명하면 컴퓨터의 cpu에는 코어가 존재하고, 코어 안에는 스레드가 있다.
작업을 실행시키면, 스레드에 작업을 할당하여 실행시키는데
Python의 thread를 할당하는 함수를 사용하여 작업을 할당시켜 반복문을 돌게 하는 것이다.
알아본 결과, Python의 thread를 할당하는 패키지는 threading, multiprocessing, subprocess 등이 있는데
병렬 실행은 성공하였지만 결과를 return하지를 못하였다.
따라서 결과를 return하는 방식이 가장 쉬운 concurrent.futures를 사용하였다.
import concurrent.futures
# 실행할 작업을 function으로 정의하기
def work(input1, input2):
return_list = []
for obj in object:
return_list.append(obj)
print(f"{obj} 과정 실행 완료.")
return return_list
# 최대 병렬 실행을 5로 정의하여 작업 후 list로 결과를 집계하고, 그 결과들을 리스트로 모으기.
with concurrent.futures.ThreadPoolExecutor(max_workers = 5) as executor:
futures = [executor.submit(work, input1, input2) for li in list]
returns = [f.result() for f in futures]
for문으로 일일히 작업하여 list로 반환하던 결과물을
병렬로 처리하여 더욱 빠르게 집계하였다.
for문을 다중으로 사용하는 것이 불가피하고
병렬 처리된 결과물을 저장하여 return하고 싶을 때 효과적인 방식이다.
'Python > 알고리즘' 카테고리의 다른 글
[자료구조] 그래프 DFS/BFS Python pseudo코드로 이해하기 (0) | 2022.02.15 |
---|---|
N개의 연속된 자연수 리스트에서 인접하지 않은 m개 뽑기 (0) | 2022.02.14 |
[collections] Python namedtuple 사용하기 (0) | 2021.10.24 |
Python 내장 패키지 itertools 도장깨기 (0) | 2021.07.05 |