Python

Python - 멀티스레딩과 병렬 처리

thebasics 2024. 11. 20. 17:00

목차

  1. 멀티스레딩과 병렬 처리란?
  2. 스레드와 프로세스의 차이점
  3. 멀티스레딩
    • threading 모듈
    • 스레드 생성 및 관리
    • 스레드 동기화
  4. 병렬 처리
    • multiprocessing 모듈
    • 프로세스 생성 및 관리
    • 프로세스 간 통신
  5. 예시 코드
  6. 결론
  7. 관련 자료 및 추가 학습 자료

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

멀티스레딩과 병렬 처리는 프로그램의 성능을 향상시키기 위한 중요한 기법입니다.

  • 멀티스레딩은 하나의 프로세스 내에서 여러 스레드를 사용하여 동시에 작업을 수행하는 방법입니다. 이를 통해 프로그램의 응답성을 높이고, I/O 작업과 같은 대기 시간이 발생하는 작업을 효율적으로 처리할 수 있습니다.
  • 병렬 처리는 여러 프로세스를 사용하여 동시에 작업을 수행하는 방법입니다. 멀티코어 프로세서를 활용하여 CPU 집약적인 작업을 병렬로 처리함으로써 성능을 향상시킵니다.

2. 스레드와 프로세스의 차이점

  • 프로세스는 운영체제에서 실행 중인 프로그램의 인스턴스를 의미하며, 각 프로세스는 독립된 메모리 공간을 갖습니다. 프로세스 간의 데이터 공유는 어렵지만 안전성이 높습니다.
  • 스레드는 프로세스 내에서 실행되는 작업 단위로, 프로세스 내의 메모리 공간을 공유합니다. 스레드 간 데이터 공유는 쉽지만, 동기화 문제를 처리해야 합니다.

멀티스레딩은 I/O 바운드 작업에 적합하며, 병렬 처리는 CPU 바운드 작업에 적합합니다.


3. 멀티스레딩

threading 모듈

Python의 threading 모듈은 멀티스레딩을 구현하는 데 사용됩니다. 이 모듈을 사용하면 여러 스레드를 생성하고 관리할 수 있으며, 스레드 간의 동기화를 처리할 수 있습니다.

스레드 생성 및 관리

스레드를 생성하려면 threading.Thread 클래스를 사용합니다. 스레드는 함수나 메서드를 대상으로 실행되며, start() 메서드를 호출하여 스레드의 실행을 시작합니다.

  • 예시: 스레드 생성 및 실행:

    import threading
    
    def print_numbers():
        for i in range(1, 6):
            print(i)
    
    # 스레드 생성
    thread = threading.Thread(target=print_numbers)
    thread.start()  # 스레드 실행
    thread.join()   # 메인 스레드가 종료될 때까지 대기
    • join() 메서드는 메인 스레드가 스레드의 실행이 완료될 때까지 기다리도록 합니다.

스레드 동기화

스레드 간에 공유되는 자원에 동시 접근하는 경우, 데이터 불일치나 경합 조건이 발생할 수 있습니다. 이를 방지하기 위해 threading.Lock을 사용하여 스레드 간의 동기화를 처리할 수 있습니다.

  • 예시: 스레드 동기화:

    import threading
    
    counter = 0
    lock = threading.Lock()
    
    def increment():
        global counter
        for _ in range(1000):
            with lock:
                counter += 1
    
    threads = []
    for _ in range(10):
        thread = threading.Thread(target=increment)
        thread.start()
        threads.append(thread)
    
    for thread in threads:
        thread.join()
    
    print(f"Counter: {counter}")
    • with lock 문을 사용하여 임계 구역을 보호하며, 스레드 간의 데이터 충돌을 방지합니다.

4. 병렬 처리

multiprocessing 모듈

Python의 multiprocessing 모듈은 멀티프로세싱을 구현하는 데 사용됩니다. 이 모듈을 사용하면 여러 프로세스를 생성하여 병렬로 작업을 수행할 수 있습니다.

프로세스 생성 및 관리

multiprocessing.Process 클래스를 사용하여 프로세스를 생성하고 관리할 수 있습니다. 프로세스는 독립된 메모리 공간을 가지므로, 데이터 공유를 위해서는 QueuePipe와 같은 도구를 사용해야 합니다.

  • 예시: 프로세스 생성 및 실행:

    import multiprocessing
    
    def print_numbers():
        for i in range(1, 6):
            print(i)
    
    # 프로세스 생성
    process = multiprocessing.Process(target=print_numbers)
    process.start()  # 프로세스 실행
    process.join()   # 메인 프로세스가 종료될 때까지 대기
    • join() 메서드는 메인 프로세스가 서브 프로세스의 실행이 완료될 때까지 기다리도록 합니다.

프로세스 간 통신

프로세스 간의 통신을 위해 multiprocessing.Queuemultiprocessing.Pipe를 사용할 수 있습니다. 이를 통해 프로세스 간 데이터를 주고받을 수 있습니다.

  • 예시: Queue를 사용한 프로세스 간 통신:

    import multiprocessing
    
    def worker(queue):
        queue.put("Data from worker")
    
    queue = multiprocessing.Queue()
    process = multiprocessing.Process(target=worker, args=(queue,))
    process.start()
    process.join()
    
    # 프로세스 간 데이터 수신
    data = queue.get()
    print(data)  # Data from worker
    • multiprocessing.Queue를 사용하여 프로세스 간 데이터를 교환합니다.

5. 예시 코드

멀티스레딩 예시

import threading
import time

def count_down(name, delay):
    while delay > 0:
        print(f"{name}: {delay} seconds remaining")
        time.sleep(1)
        delay -= 1
    print(f"{name} done!")

# 스레드 생성 및 실행
thread1 = threading.Thread(target=count_down, args=("Thread1", 3))
thread2 = threading.Thread(target=count_down, args=("Thread2", 5))

thread1.start()
thread2.start()

thread1.join()
thread2.join()

print("All threads are done!")

병렬 처리 예시

import multiprocessing

def square_numbers(numbers, queue):
    for number in numbers:
        queue.put(number * number)

numbers = [1, 2, 3, 4, 5]
queue = multiprocessing.Queue()

process = multiprocessing.Process(target=square_numbers, args=(numbers, queue))
process.start()
process.join()

# 프로세스 간 데이터 수신
squares = []
while not queue.empty():
    squares.append(queue.get())

print(squares)  # [1, 4, 9, 16, 25]

6. 결론

멀티스레딩과 병렬 처리는 Python 프로그램의 성능을 향상시키기 위한 강력한 기법입니다. threading 모듈을 사용하여 스레드를 생성하고 관리함으로써 I/O 바운드 작업의 응답성을 높일 수 있으며, multiprocessing 모듈을 통해 프로세스를 병렬로 실행하여 CPU 집약적인 작업을 효율적으로 처리할 수 있습니다. 멀티스레딩과 병렬 처리를 적절히 활용하면 프로그램의 성능을 극대화할 수 있지만, 스레드 동기화나 프로세스 간 통신과 같은 복잡한 부분을 신중하게 처리해야 합니다.


7. 관련 자료 및 추가 학습 자료


이 글에서는 Python에서 멀티스레딩과 병렬 처리를 구현하는 방법을 살펴보았습니다. threadingmultiprocessing 모듈을 활용하여 프로그램의 성능을 향상시키는 방법을 이해하고, 이를 통해 더욱 효율적인 동시성 및 병렬 처리를 구현해 보세요.

반응형