Python MultiProcessing Pool사용법

2021. 8. 24. 16:23프로그래밍 개발(Development)/Python

반응형

Array, List를 처리하는 방법으로는 for문, while문 등 루프를 이용해서 순차적으로 데이터를 처리한다.

 

데이터의 양이 많지 않을 경우에는 순차적으로 처리해도 무방하지만, 방대한 양의 데이터를 처리하기엔 시간이 다소 오래 걸린다.

 

그래서 많이 사용하는 MultiProcessing pool의 대해서 알아보자.

 

MultiProcessing pool이란 사용자가 일정 범위 내의 Process를 지정하면, 지정한 범위 내에서 작업이 순차적으로 이루어진다.

 

예를 들어 100개의 작업 리스트가 있고 10개의 Process를 지정 하였다면, 순차적으로 10개를 먼저 병렬 처리 방식으로 데이터를 처리하고 먼저 종료 되는 작업이 다음 순서의 작업을 불러오는 방식이다.

 

작업리스트에는 순서가 있지만, 실제로 pool 내에서 작업 처리하는 방식에는 순서가 없다.

 

다만 work 함수 내에서 결과를 받지 않고 직접 데이터 저장 단계로 간다면 순서의 개념이 필요가 없지만,

return으로 결과를 받는다면, pool이 모든 작업을 처리하고 주는 결과물에는 기존의 작업리스트의 순서가 보장된다.

 

이제 아래의 코드로 내용을 확인해 보자.

"""
multiprocessing.dummy의 Pool 클래스를 사용한다.
"""
from multiprocessing.dummy import Pool

"""
실제 작업 리스트가 수행하는 함수로 return을 할 수도 있고 직접 처리를 할 수도 있다.
"""
def working(work):
    temp_dict = {}
    temp_dict[work] = work
    print (temp_dict)
    return temp_dict
    
"""
Thread Pool을 생성하고 pool에 작업 리스트를 할당하는 함수이다.
이 또한 pool.map으로부터 결과를 받게 되면, list 형식으로 데이터를 리턴 받게 된다.
"""
def workThread(worklist, threadnum = 10):
    pool = Pool(threadnum)
    result = pool.map(working, worklist)
    print (result)
    pool.close()
    pool.join()

    return result

number_list = [1,2,3,4,5,6,7,8,9]
result = workThread(number_list, 5)
print (result)

아래의 결과를 보게 되면, working 함수내의 작업 결과는 순서의 개념이 없지만, 각 결과를 취합한 내용을 보면

기존의 순서를 기억하고 있는걸 확인 할 수있다.

결과

반응형