본문 바로가기
Python for Beginners

16.3 멀티스레딩 및 병렬 처리

by Andrew's Akashic Records 2023. 5. 8.
728x90

파이썬에서 멀티스레딩과 병렬 처리는 동시에 여러 작업을 처리하도록 프로그램을 구성하는 방법입니다. 멀티스레딩은 여러 스레드를 사용하여 실행 중인 프로세스 내에서 동시성을 제공하며, 병렬 처리는 여러 프로세스를 동시에 실행하여 처리합니다.

파이썬에서는 `threading` 모듈을 사용하여 멀티스레딩을 구현할 수 있습니다. 또한, `concurrent.futures` 모듈을 사용하여 멀티스레딩 및 멀티프로세싱을 추상화하여 구현할 수 있습니다.

멀티스레딩 예시

import threading
import time

def worker_thread(number):
    print(f"Thread {number} started")
    time.sleep(2)  # 예를 들어, 2초 동안 작업하는 스레드를 가정합니다.
    print(f"Thread {number} finished")

threads = []

# 스레드 생성
for i in range(5):
    thread = threading.Thread(target=worker_thread, args=(i,))
    threads.append(thread)
    thread.start()

# 모든 스레드가 종료될 때까지 대기
for thread in threads:
    thread.join()

print("All threads completed")


병렬 처리 예시
파이썬에서 병렬 처리를 구현하려면 `multiprocessing` 모듈을 사용할 수 있습니다. 다음은 간단한 병렬 처리 예제입니다.

import multiprocessing
import time

def worker_process(number):
    print(f"Process {number} started")
    time.sleep(2)  # 예를 들어, 2초 동안 작업하는 프로세스를 가정합니다.
    print(f"Process {number} finished")

processes = []

# 프로세스 생성
for i in range(5):
    process = multiprocessing.Process(target=worker_process, args=(i,))
    processes.append(process)
    process.start()

# 모든 프로세스가 종료될 때까지 대기
for process in processes:
    process.join()

print("All processes completed")

 

`concurrent.futures`를 사용한 멀티스레딩 및 병렬 처리 예시
`concurrent.futures`를 사용하면, Executor 객체를 생성하여 멀티스레딩 또는 멀티프로세싱을 추상화하여 구현할 수 있습니다. 다음 예제에서는 ThreadPoolExecutor 및 ProcessPoolExecutor를 사용하여 각각 멀티스레딩과 병렬 처리를 구현합니다.

import concurrent.futures
import time

def worker(number):
    print(f"Worker {number} started")
    time.sleep(2)  # 예를 들어, 2초 동안 작업하는 워커를 가정합니다.
    print(f"Worker {number} finished")

numbers = range(5)

# ThreadPoolExecutor를 사용한 멀티스레딩 예제
print("Multithreading example:")
with concurrent.futures.ThreadPoolExecutor() as executor:
    executor.map(worker, numbers)
print("All threads completed")

# ProcessPoolExecutor를 사용한 병렬 처리 예제
print("\nMultiprocessing example:")
with concurrent.futures.ProcessPoolExecutor() as executor:
    executor.map(worker, numbers)
print("All processes completed")


이 예제에서는 `concurrent.futures`의 `ThreadPoolExecutor`를 사용하여 멀티스레딩을 구현하고, `ProcessPoolExecutor`를 사용하여 병렬 처리를 구현합니다. `executor.map()` 함수를 사용하면 작업자(worker) 함수와 매개변수를 전달하여 동시에 여러 작업을 처리할 수 있습니다.

이처럼, 파이썬에서는 멀티스레딩 및 병렬 처리를 구현하기 위해 `threading`, `multiprocessing`, `concurrent.futures` 등의 모듈을 사용할 수 있습니다. 이를 통해 프로그램의 성능을 향상시킬 수 있지만, 동시성과 관련된 복잡한 문제를 고려해야 합니다. 예를 들어, 공유 데이터에 대한 동시 접근을 제어하기 위해 락(lock)을 사용하거나, 스레드 간의 동기화를 위해 조건 변수(condition variable) 등을 사용해야 할 수도 있습니다.

 

멀티스레딩과 멀티프로세싱은 서로 다른 상황에서 권장되는 경우가 있습니다. 각 방법의 특징을 이해하고, 작업의 요구 사항에 따라 적절한 방법을 선택해야 합니다.

멀티스레딩이 권장되는 경우:

  1. I/O 바운드 작업: 멀티스레딩은 I/O 바운드 작업에 효율적입니다. 예를 들어, 파일을 읽고 쓰거나 네트워크에서 데이터를 전송하는 작업이 있을 때, 멀티스레딩을 사용하면 I/O 작업이 끝날 때까지 기다리는 동안 다른 스레드가 실행되므로 전체 작업 시간을 줄일 수 있습니다.
  2. 메모리 사용량: 스레드는 동일한 프로세스 내에서 메모리를 공유하므로, 메모리 사용량이 상대적으로 적습니다. 많은 작업을 동시에 처리해야 하지만 메모리 제약이 있는 경우에 멀티스레딩이 좋은 선택입니다.
  3. 공유 데이터: 멀티스레딩을 사용하면 스레드간에 데이터를 쉽게 공유할 수 있습니다. 그러나 동시에 여러 스레드에서 공유 데이터에 접근할 때 동기화 문제를 신중하게 처리해야 합니다.

멀티프로세싱이 권장되는 경우:

  1. CPU 바운드 작업: 멀티프로세싱은 CPU 바운드 작업에 효율적입니다. 각 프로세스는 독립적인 메모리 공간과 별도의 GIL(Global Interpreter Lock)을 가지기 때문에, 멀티코어 프로세서에서 병렬 처리를 통해 CPU 사용량을 최적화할 수 있습니다.
  2. 프로세스 격리: 멀티프로세싱은 각 프로세스가 독립적인 메모리 공간을 가지므로, 하나의 프로세스에서 발생하는 오류나 예외가 다른 프로세스에 영향을 미치지 않습니다. 이런 특징은 격리와 안정성이 중요한 작업에서 유용합니다.
  3. 자원 활용: 멀티프로세싱은 멀티코어 프로세서의 모든 코어를 활용할 수 있습니다. 따라서 병렬 처리를 통해 작업 속도를 향상시키는데 효과적입니다.


그러나, 멀티프로세싱의 경우 다음과 같은 주의사항도 고려해야 합니다.

  • 메모리 사용량: 멀티프로세싱은 각 프로세스가 독립적인 메모리 공간을 가지므로, 전체 메모리 사용량이 높아질 수 있습니다. 따라서 메모리 제약이 있는 상황에서는 멀티프로세싱이 적합하지 않을 수 있습니다.
  • 프로세스 간 통신: 프로세스 간에 데이터를 공유하려면 명시적인 통신 메커니즘(IPC, Inter-Process Communication)을 사용해야 합니다. 이는 스레드간의 데이터 공유에 비해 복잡하고 오버헤드가 발생할 수 있습니다.

결론적으로, 멀티스레딩과 멀티프로세싱은 각각의 특징과 장단점이 있으며, 작업의 요구사항과 성능 목표에 따라 적절한 방법을 선택해야 합니다. I/O 바운드 작업, 메모리 제약이 있거나 공유 데이터를 사용하는 경우에는 멀티스레딩이 적합할 수 있으며, CPU 바운드 작업, 프로세스 격리가 필요한 경우에는 멀티프로세싱이 적합할 수 있습니다.

 

728x90

'Python for Beginners' 카테고리의 다른 글

17.1 게임 개발  (0) 2023.05.08
16.4 JIT 컴파일과 Cython  (0) 2023.05.08
16.2 코드 최적화 기법  (0) 2023.05.08
16.1 프로파일링  (0) 2023.05.08
15.5 강화학습 기반 딥러닝(DQN, A3C 등)  (0) 2023.05.02