[파이썬] 멀티스레딩과 병렬 처리의 성능 측정 및 비교

많은 현대 어플리케이션들은 대용량 데이터를 처리하거나 복잡한 계산 작업을 수행해야 합니다. 이러한 작업들은 단일 스레드로 처리하면 시간이 오래 걸리는 문제가 발생할 수 있습니다. 멀티스레딩과 병렬 처리는 이러한 문제를 해결하고 성능을 향상시키는 데 도움을 줄 수 있습니다.

멀티스레딩과 병렬 처리란?

멀티스레딩은 하나의 프로세스가 여러 개의 스레드를 동시에 실행함으로써 동시성을 활용하는 방식입니다. 각 스레드는 독립적으로 실행되며 공유 변수에 대한 동시 액세스 문제가 발생할 수 있습니다. 이를 해결하기 위해 동기화 기법(락, 세마포어 등)을 사용합니다.

반면에 병렬 처리는 하나의 작업을 여러 개의 작은 작업으로 나누어 독립적으로 처리하는 방식입니다. 이러한 작업은 병렬적으로 실행되며, 여러 개의 CPU 코어 또는 컴퓨터를 사용하여 처리할 수 있습니다.

성능 측정 및 비교

성능 측정을 위해 Python에서는 time 모듈을 사용할 수 있습니다. time.time() 함수는 현재 시간을 초 단위로 반환해주며, 이를 이용하여 작업에 소요된 시간을 측정할 수 있습니다.

다음은 멀티스레딩과 병렬 처리를 사용하여 동일한 작업을 수행하는 예제 코드입니다.

import time
import threading
from multiprocessing import Pool

# 멀티스레딩 예제
def task_thread(n):
    sum = 0
    for i in range(n):
        sum += i
    return sum

def multi_threading():
    start_time = time.time()
    threads = []
    for i in range(5):
        t = threading.Thread(target=task_thread, args=(10000000,))
        t.start()
        threads.append(t)
    
    for t in threads:
        t.join()
    
    end_time = time.time()
    print("멀티스레딩으로 작업 소요 시간:", end_time - start_time, "초")

# 병렬 처리 예제
def task_process(n):
    sum = 0
    for i in range(n):
        sum += i
    return sum

def parallel_processing():
    start_time = time.time()
    p = Pool(processes=5)
    results = [p.apply_async(task_process, args=(10000000,)) for _ in range(5)]
    output = [result.get() for result in results]
    p.close()
    p.join()

    end_time = time.time()
    print("병렬 처리로 작업 소요 시간:", end_time - start_time, "초")

multi_threading()
parallel_processing()

위 예제 코드는 5개의 스레드 또는 프로세스를 생성하여 각각 1부터 10000000까지의 숫자를 더하는 작업을 수행합니다. 멀티스레딩과 병렬 처리를 각각 multi_threading()parallel_processing() 함수에서 실행하며, 작업 소요 시간을 출력합니다.

실행 결과는 실행 환경에 따라 다를 수 있지만, 보통 병렬 처리가 멀티스레딩보다 더 빠른 성능을 보입니다. 이는 병렬 처리는 여러 개의 CPU 코어나 컴퓨터를 동시에 사용하여 작업을 분산 처리하기 때문입니다.

하지만 성능 비교 결과는 항상 동일하지 않을 수 있으며, 작업의 종류에 따라서도 성능 차이가 발생할 수 있습니다. 따라서 실제 어플리케이션의 성능을 측정하기 전에 여러 가지 요소를 고려해야 합니다.

결론

멀티스레딩과 병렬 처리는 대용량 데이터 처리나 복잡한 계산 작업의 성능을 향상시키기 위한 중요한 기술입니다. 성능 측정을 통해 개발자는 어플리케이션의 요구에 맞는 가장 효율적인 방법을 선택할 수 있고, 최적화를 진행할 수 있습니다. 그러나 성능 평가는 항상 환경과 작업에 따라 다르기 때문에 신중하게 진행해야 합니다.