파이썬(Python) Multiprocessing - Pool
오늘은 파이썬 멀티프로세싱을 활용하는 첫 번째 예제를 설명하겠습니다.
멀티 프로세싱을 활용하면 복잡하고 시간이 걸리는 작업을 별도의 프로세스를 생성 후 병렬처리해서
보다 빠른 응답처리 속도를 기대할 수 있는 장점이 있습니다.
최근들어 대용량의 빅데이터의 분석 및 예측 등의 머신러닝을 지원하는 다양한 패키지에서 대부분
멀티 프로세싱을 활용해서 멀티코어의 CPU의 장점을 극대화하고 빠른 처리를 지원하고 있습니다.
다만, 충분한 사전 지식 및 병렬 프로그래밍의 이해 없이 코드를 작성한다면, 싱글 프로세스의 응답속도보다
시간이 지연되고 별도로 예상치 못한 결과가 나타날 수 있으니 프로세스 및 쓰레드 등의 지식이 중요합니다.
또한, 멀티프로세싱은 오버헤드의 증가 및 메모리 사용률이 높아지는 단점도 존재합니다.
그러면 문서 하단에서 간단하게 예제를 작성해보겠습니다.
Python 관련 포스팅 : Python 관련
Python 관련 포스팅 : Python 관련
파이썬(Python) MultiProcessing - 구조
보통 Multiprocessing 실행 흐름은 아래와 같이 나타낼 수 있으며, 관련 예제는 하단에서 설명합니다.
MultiProcessing 처리 구조 - 출처
파이썬(Python) MultiProcessing(Pool) - 예제 코드
파이썬을 활용해서 5만 단위로 4회 반복하는(총 20만 카운트)예제 파일이며, 이를 일반적인 코드 구현과
멀티프로세싱을 활용해서 각각 실행 시간 측정을 비교하는 예제 소스 코드입니다.
multi_pro1.py
123456789101112131415 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번 라인 : 프로그램 종료 후 최종 측정 시간 출력
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 함수 선언
- 15번 라인 : 프로그램 종료 후 최종 측정 시간 출력
multi_pro2.py
multi_pro2.py
12345678910111213141516171819202122 import multiprocessingimport 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번 라인 : 프로그램 종료 후 최종 측정 시간 출력
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 함수 선언
- 18번 라인 : pool의 map 메소드를 활용해서 실행 할 count 메소드와 num_list 전달
Python multiprocessing 의 추가적인 상세 설명은 이 곳을 참고해 주세요.
Python multiprocessing 의 추가적인 상세 설명은 이 곳을 참고해 주세요.
파이썬(Python) MultiProcessing(Pool) - 예제 실행 화면
아래 이미지로 실제 실행 화면을 확인하실 수 있습니다.
실제 실행 화면1
실제 실행 화면2
마무리
이번 포스팅에서는 파이썬 멀티프로세싱의 Pool을 활용해서 간단한 성능 비교를 진행했습니다.
간단한 테스트에서는 결과 값이 대동소이 하지만, 데이터의 양이 기하급수적으로 증가할 수록
결과 값은 많은 차이가 날 것으로 기대 됩니다.
Pool은 데이터를 병렬화해서 함수의 결과를 좀 더 빠르게 응답받을 수 있는 장점이 있습니다.
멀티프로세싱과 쓰레드의 장단점 및 특징을 정확하게 이해한 후 구현해야 원하는 프로그램을
완성 할 수 있다는 생각이 듭니다.
다음 시간에는 파이썬 멀티 프로세싱(Multi Processing)의 프로세스(process) 활용에 대해서
포스팅 하겠습니다.
소스코드 다운로드 : python_multi(1).zip
'언어 > Python' 카테고리의 다른 글
파이썬(Python) - 정규표현식(Regex) 특수문자 제거 설명 및 예제 소스 코드 (3) | 2018.07.20 |
---|---|
파이썬(Python) - multiprocessing(멀티프로세싱) 설명 및 예제(2) - Process (4) | 2018.06.12 |
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(4) - 일정 주기 반복 실행 (2) | 2018.05.25 |
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(3) - 데이터 통신 (4) | 2018.05.12 |
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(2) - 동기화 (0) | 2018.05.09 |