Python

[Python] 파이썬 멀티프로세싱(multiprocessing) 구현 예제 : 멀티 쓰레드(multi-Thread)와 실행시간 차이 분석

파이썬에서 다중 CPU에서 병렬 실행을 위해서는 다중 프로세스를 이용하는 multiprocessing 모듈을 사용해야 합니다. 멀티 쓰레드를 구현하여 실행한 결과 프로세스 처리시간은 동일하였습니다. 그 이유는 파이썬 GIL 정책때문입니다.

자세한 내용은 아래 글을 확인하세요.

 

[Python] 파이썬  싱글 쓰레드(Single Thread)와 멀티 쓰레드(multi Thread) 사용 예제 및 개념 이해하기

 

[Python] 파이썬 싱글 쓰레드(Single Thread)와 멀티 쓰레드(multi Thread) 사용 예제 및 개념 이해하기

파이썬은 인터프리터 언어입니다. 파이썬은 싱글 쓰레드(Single Thread)에서 순차적으로 동작합니다. 한번에 하나의 작업밖에 할 수 없는 것입니다. 그럼으로 한 번에 여러 작업을 하기 위해서는 thr

playground.naragara.com

그렇다면 진정한 병렬처리를 위해서는 multiprocessing모듈을 사용합니다. multiprocessing 모듈은 쓰레드(Thread) 대신 프로세스를 만들어 병렬로 처리합니다.  구현방법은 Thread를 구현하던 방법과 거의 동일합니다.

Thread함수 대신 Process함수를 사용하여 처리합니다. 그리고 result 결과값을 받기 위해 Queue를 사용합니다. Queue는 대표적인 데이터 구조의 하나로 FIFO(First-In, First-Out) 방식입니다. 가장 먼저 큐에 들어온 놈이 가장 먼저 나간다는 뜻으로 은행에서 대기표 받고 기다리는 것을 생각하면 이해하기 쉽습니다.

from multiprocessing import Process, Queue
import time


def addition_operation(work_id, start, end, result):
    print(f'작업단위 : {work_id}')
    total = 0
    for i in range(start, end):
        total += i
    result.put(total)
    return

if __name__ == '__main__':
    result_list = Queue()
    process1 = Process(target=addition_operation, args=(1, 0, 50000000, result_list))
    process2 = Process(target=addition_operation, args=(2, 50000000, 100000000, result_list))
    start_time = time.perf_counter() #스톱워치랑 같은 개념
    start_time5 = time.process_time() #코드 효율성비교는 process_time()함수를 사용하는 것이 유용
    process1.start()
    process2.start()
    process1.join()
    process2.join()


    total = 0
    qsize = result_list.qsize()
    while qsize > 0:
        total = total + result_list.get()
        qsize = qsize - 1
        

    print(f"덧셈결과: {total}")
    end_time = time.perf_counter()
    end_time5 = time.process_time()

    print("스톱워치 : 쓰레드 작업 실행시간(초):", end_time - start_time)
    print("코드 효율성비교 : 프로세스 실행시간:", end_time5 - start_time5)
    
    
#실행결과    
작업단위 : 1
작업단위 : 2
덧셈결과: 4999999950000000
스톱워치 : 쓰레드 작업 실행시간(초): 3.6920032
코드 효율성비교 : 프로세스 실행시간: 0.015625    

실행결과를 프로세스 실행시간이 0.015625초 입니다. 멀티 쓰레드로 구현하여 처리하였을 때는 5.3125초가 나왔습니다. 각각의 프로세스가 각자의 메모리 영역을 사용하게됨으로 처리속도가 훨씬 빨라졌습니다. 갑자기 쿼리를 아무리 거지같이 짜도 메모리 DB에서는 엄청 빠르다는 얘기가 생각나는 이유는 뭘까요.

 

쓰레드를 구현했을때와 또 다른 차이점은 멀티프로세스를 구현할때 if __name__ == ‘__main__’: 조건문이 꼭 필요합니다. 그렇지 않으면 실행할때 오류가 발생하였습니다.

 

 

[REFERENCE]

monkey3199.github.io/develop/python/2018/12/04/python-pararrel.html

 

 

[파이썬 더 알아보기]

[프로그래밍/Python] – [Python] 파이썬 코드 실행시간(시:분:초) 측정하는 방법 예제 총정리: time(), timedelta(),process_time(), perf_counter(),default_timer()

[프로그래밍/Python] – [Python] 파이썬 패키지(Package), 모듈(Module) 개념 및 예제 : 패키지, 모듈을 만들고 불러오기(import)

[프로그래밍/Python] – [Python] 파이썬 랜덤 숫자 뽑기 난수 발생(random) 예제 총정리 : randint(), randrange(), uniform(), shuffle(), choice(), choices(), simple()

[프로그래밍/Python] – [Python] 파이썬 클래스(class) 와 생성자(__init__) 사용방법 및 예제 총정리

[프로그래밍/Python] – [Python] 파이썬 기본(기초) 문법 : 예제 및 총정리

 

Leave a Reply

error: Content is protected !!