Akashic Records

16.3 멀티스레딩 및 병렬 처리 본문

Python for Beginners

16.3 멀티스레딩 및 병렬 처리

Andrew's Akashic Records 2023. 5. 8. 10:29
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
Comments