파이썬(Python) Multiprocessing - Process
오늘은 파이썬 멀티프로세싱을 활용하는 두 번째 예제를 설명하겠습니다.
멀티 프로세싱을 활용하면 복잡하고 시간이 걸리는 작업을 별도의 프로세스를 생성 후 병렬처리해서
보다 빠른 응답처리 속도를 기대할 수 있는 장점이 있습니다.
최근들어 대용량의 빅데이터의 분석 및 예측 등의 머신러닝을 지원하는 다양한 패키지에서 대부분
멀티 프로세싱을 활용해서 멀티코어의 CPU의 장점을 극대화하고 빠른 처리를 지원하고 있습니다.
다만, 충분한 사전 지식 및 병렬 프로그래밍의 이해 없이 코드를 작성한다면, 싱글 프로세스의 응답속도보다
시간이 지연되고 별도로 예상치 못한 결과가 나타날 수 있으니 프로세스 및 쓰레드 등의 지식이 중요합니다.
또한, 멀티프로세싱은 오버헤드의 증가 및 메모리 사용률이 높아지는 단점도 존재합니다.
그러면 문서 하단에서 간단하게 예제를 작성해보겠습니다.
Python 관련 포스팅 : Python 관련
Python 관련 포스팅 : Python 관련
파이썬(Python) MultiProcessing - 구조
보통 Multiprocessing 실행 흐름은 아래와 같이 나타낼 수 있으며, 관련 예제는 하단에서 설명합니다.
MultiProcessing 처리 구조 - 출처
파이썬(Python) MultiProcessing(Process) - 예제 코드
파이썬을 멀티프로세스의 프로세스 객체를 활용해서 10만 단위로 4회 반복(총 40만 카운트) 및 그에 따른 총
수행시간 측정을 하는 예제입니다.
multi_pro3.py
123456789101112131415161718192021222324252627282930 from multiprocessing import Processimport timeimport os #시작시간start_time = time.time() #멀티쓰레드 사용 (40만 카운트 출력)def count(cnt): proc = os.getpid() for i in range(cnt): print("Process Id : ", proc ," -- ",i) if __name__ == '__main__': #멀티 쓰레딩 Process 사용 num_arr = [100000, 100000, 100000, 100000] procs = [] for index, number in enumerate(num_arr): #Process 객체 생성 proc = Process(target=count, args=(number,)) procs.append(proc) proc.start() #프로세스 종료 대기 for proc in procs: proc.join() #종료시간print("--- %s seconds ---" % (time.time() - start_time)) cs
- 6번 라인 : time 패키지를 활용 - 시작시작 변수에 저장
- 7번 라인 : 1 ~ 100000 까지 반복 순회 위한 count 함수 선언- 16번 라인 : num_arr 크기 만큼 count 함수 실행- 21번 라인 : Process 객체 생성 및 메소드, 매개변수 바인딩
- 23번 라인 : Process 작업 시작- 27번 라인 : 리스트에 담은 프로세스 작업 종료 대기 위해 리스트 참조 후 Join 반복 호출- 30번 라인 : 총 수행 시간 출력
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | from multiprocessing import Process import time import os #시작시간 start_time = time.time() #멀티쓰레드 사용 (40만 카운트 출력) def count(cnt): proc = os.getpid() for i in range(cnt): print("Process Id : ", proc ," -- ",i) if __name__ == '__main__': #멀티 쓰레딩 Process 사용 num_arr = [100000, 100000, 100000, 100000] procs = [] for index, number in enumerate(num_arr): #Process 객체 생성 proc = Process(target=count, args=(number,)) procs.append(proc) proc.start() #프로세스 종료 대기 for proc in procs: proc.join() #종료시간 print("--- %s seconds ---" % (time.time() - start_time)) | cs |
- 6번 라인 : time 패키지를 활용 - 시작시작 변수에 저장
- 7번 라인 : 1 ~ 100000 까지 반복 순회 위한 count 함수 선언
- 23번 라인 : Process 작업 시작
Python multiprocessing 의 추가적인 상세 설명은 이 곳을 참고해 주세요.
Python multiprocessing 의 추가적인 상세 설명은 이 곳을 참고해 주세요.
파이썬(Python) MultiProcessing(Process) - 예제 실행 화면
아래 이미지로 실제 실행 화면을 확인하실 수 있습니다.
실제 실행 화면
마무리
이번 포스팅에서는 파이썬 멀티프로세싱의 Process 을 활용해서 간단한 성능 테스트를 진행했습니다.
Process는 쓰레드와 상당히 유사하며, 일련의 프로세스를 생성 후 작업하므로 시스템의 여러 프로세스의
자원을 충분히 활용할 수 있다는 장점이 있습니다.
쓰레드와 마찬가지로 프로세스의 수, 동기화 관련 지식, 병렬처리 등에 관한 충분한 습득 후 코딩을
시작해야 안정적인 프로그램을 작성하실 수 있습니다.
다음 시간에는 파이썬 멀티 프로세싱(Multi Processing)의 프로세스 상호간의 통신(Communication) 방법
에 관해서 포스팅 하겠습니다.
소스코드 다운로드 : python_multi(2).zip
'언어 > Python' 카테고리의 다른 글
파이썬(Python) - 람다(lambda)식 및 map 사용 예제 및 소스코드 (0) | 2018.10.31 |
---|---|
파이썬(Python) - 정규표현식(Regex) 특수문자 제거 설명 및 예제 소스 코드 (3) | 2018.07.20 |
파이썬(Python) - multiprocessing(멀티프로세싱) 설명 및 예제(1) - Pool (4) | 2018.05.31 |
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(4) - 일정 주기 반복 실행 (2) | 2018.05.25 |
파이썬(Python) - Thread(쓰레드) 설명 및 예제 소스 코드(3) - 데이터 통신 (4) | 2018.05.12 |