본문 바로가기

언어/Python

파이썬(Python) - multiprocessing(멀티프로세싱) 설명 및 예제(1) - Pool


파이썬(Python) Multiprocessing - Pool



오늘은 파이썬 멀티프로세싱을 활용하는 첫 번째 예제를 설명하겠습니다.

멀티 프로세싱을 활용하면 복잡하고 시간이 걸리는 작업을 별도의 프로세스를 생성 후 병렬처리해서 
보다 빠른 응답처리 속도를 기대할 수 있는 장점이 있습니다.

최근들어 대용량의 빅데이터의 분석 및 예측 등의 머신러닝을 지원하는 다양한 패키지에서 대부분
멀티 프로세싱을 활용해서 멀티코어의 CPU의 장점을 극대화하고 빠른 처리를 지원하고 있습니다.

다만, 충분한 사전 지식 및 병렬 프로그래밍의 이해 없이 코드를 작성한다면, 싱글 프로세스의 응답속도보다 
시간이 지연되고 별도로 예상치 못한 결과가 나타날 수 있으니 프로세스 및 쓰레드 등의 지식이 중요합니다.


또한, 멀티프로세싱은 오버헤드의 증가 및 메모리 사용률이 높아지는 단점도 존재합니다.

그러면 문서 하단에서 간단하게 예제를 작성해보겠습니다.

Python 관련 포스팅  :  Python 관련



파이썬(Python) MultiProcessing - 구조


보통 Multiprocessing 실행 흐름은 아래와 같이 나타낼 수 있으며, 관련 예제는 하단에서 설명합니다.




MultiProcessing 처리 구조 - 출처





파이썬(Python) 
MultiProcessing(Pool) - 예제 코드


파이썬을 활용해서 5만 단위로 4회 반복하는(총 20만 카운트)예제 파일이며, 이를 일반적인 코드 구현과 
멀티프로세싱을 활용해서 각각 실행 시간 측정을 비교하는 예제 소스 코드입니다.


multi_pro1.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import time
 
#시작시간
start_time = time.time()
 
#멀티쓰레드 사용 하지 않은 경우 (20만 카운트)
def count(name):
    for i in range(1,50001):
        print(name," : ",i)
 
num_list = ['p1''p2''p3''p4']
for num in num_list:
    count(num)
 
print("--- %s seconds ---" % (time.time() - start_time))
cs

- 4번 라인 : time 패키지를 활용 - 시작시작 변수에 저장
- 7번 라인 : 1 ~ 50000 까지 반복 순회 위한 count 함수 선언
- 11번 라인 : 각 실행을 구분하기 위해 num_list 리스트 선언
- 13번 라인 : num_list 크기 만큼 count 함수 실행
- 15번 라인 : 프로그램 종료 후 최종 측정 시간 출력


multi_pro2.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import multiprocessing
import time
 
#시작시간
start_time = time.time()
 
#멀티쓰레드 사용 하는 경우 (20만 카운트)
#Pool 사용해서 함수 실행을 병렬
def count(name):
    for i in range(1,50001):
        print(name," : ",i)
 
num_list = ['p1''p2''p3''p4']
 
if __name__ == '__main__':
    #멀티 쓰레딩 Pool 사용
    pool = multiprocessing.Pool(processes=2# 현재 시스템에서 사용 할 프로세스 개수
    pool.map(count, num_list)
    pool.close()
    pool.join()
 
print("--- %s seconds ---" % (time.time() - start_time))
cs

- 4번 라인 : 
time 패키지를 활용 - 시작시작 변수에 저장
- 7번 라인 : 1 ~ 50000 까지 반복 순회 위한 count 함수 선언
- 10번 라인 : 각 실행을 구분하기 위해 num_list 리스트 선언
- 17번 라인 : multiprocessing 패키지의 pool 객체 생성 (프로세스는 2개 지정)
- 18번 라인 : pool의 map 메소드를 활용해서 실행 할 count 메소드와 num_list 전달 
- 19번, 20번 라인 : 리소스 낭비를 방지하기 위해 close 호출 및 작업 완료 대기 위해 join 함수 호출
- 22번 라인 : 프로그램 종료 후 최종 측정 시간 출력

Python multiprocessing 의 추가적인 상세 설명은 이 곳을 참고해 주세요.



파이썬(Python) MultiProcessing(Pool) - 예제 실행 화면


아래 이미지로 실제 실행 화면을 확인하실 수 있습니다.


실제 실행 화면1



실제 실행 화면2



마무리


이번 포스팅에서는 파이썬 멀티프로세싱의 Pool을 활용해서 간단한 성능 비교를 진행했습니다.

간단한 테스트에서는 결과 값이 대동소이 하지만, 데이터의 양이 기하급수적으로 증가할 수록 
결과 값은 많은 차이가 날 것으로 기대 됩니다.


Pool은 데이터를 병렬화해서 함수의 결과를 좀 더 빠르게 응답받을 수 있는 장점이 있습니다.

멀티프로세싱과 쓰레드의 장단점 및 특징을 정확하게 이해한 후 구현해야 원하는 프로그램을 
완성 할 수 있다는 생각이 듭니다.


다음 시간에는 파이썬 멀티 프로세싱(Multi Processing)의 프로세스(process) 활용에 대해서
포스팅 하겠습니다.

소스코드 다운로드 :   python_multi(1).zip




  • 도움되었어요! 2019.04.22 18:30

    좋은글에 댓글 남겨요. 아주 많은 도움 되었습니다.
    한가지 첨삭하자면 카운트 값을 아무리 올려도 두 경우의 속도차이가 안나는걸 확인할 수 있는데요 이 이유는 터미널에 출력하는 속도가 너무 느려서 강제로 코어의 속도가 제한이 걸리는걸로 보입니다.
    하나하나 print 하는것이 아닌 sum을 하면 확실한 속도차이를 볼 수 있더라구요. 제가 도움이 되었듯이 글쓴이분도 조금이라도 도움이 되셨길 바랍니다.

  • 도움되었나요? 2019.11.21 11:20

    관리자의 승인을 기다리고 있는 댓글입니다