Akashic Records

11.2 멀티스레딩 및 멀티프로세싱 본문

Python for Beginners

11.2 멀티스레딩 및 멀티프로세싱

Andrew's Akashic Records 2023. 4. 1. 22:14
728x90

파이썬에서는 멀티스레딩과 멀티프로세싱을 사용하여 병렬 프로그래밍을 할 수 있습니다. 멀티스레딩은 여러 개의 스레드를 사용하여 동시에 여러 작업을 처리하는 기법이고, 멀티프로세싱은 여러 개의 프로세스를 사용하여 동시에 여러 작업을 처리하는 기법입니다.

멀티스레딩
멀티스레딩은 파이썬에서 threading 모듈을 사용하여 구현할 수 있습니다. Thread 클래스의 객체를 생성하고, start 메서드를 호출하여 스레드를 실행할 수 있습니다. 다음은 간단한 멀티스레딩 예제입니다.

import threading

def print_numbers():
    for i in range(10):
        print(i)

def print_letters():
    for letter in 'abcdefghij':
        print(letter)

# 스레드 생성
t1 = threading.Thread(target=print_numbers)
t2 = threading.Thread(target=print_letters)

# 스레드 시작
t1.start()
t2.start()

# 스레드가 종료될 때까지 대기
t1.join()
t2.join()

print("All threads finished.")

 

멀티프로세싱
멀티프로세싱은 파이썬에서 multiprocessing 모듈을 사용하여 구현할 수 있습니다. Process 클래스의 객체를 생성하고, start 메서드를 호출하여 프로세스를 실행할 수 있습니다. 다음은 간단한 멀티프로세싱 예제입니다.

import multiprocessing

def print_numbers():
    for i in range(10):
        print(i)

def print_letters():
    for letter in 'abcdefghij':
        print(letter)

# 프로세스 생성
p1 = multiprocessing.Process(target=print_numbers)
p2 = multiprocessing.Process(target=print_letters)

# 프로세스 시작
p1.start()
p2.start()

# 프로세스가 종료될 때까지 대기
p1.join()
p2.join()

print("All processes finished.")

멀티스레딩과 멀티프로세싱의 선택은 프로그램의 요구 사항에 따라 달라집니다. 멀티스레딩은 글로벌 인터프리터 락(Global Interpreter Lock, GIL) 때문에 CPU 집약적인 작업에서 성능 향상을 기대하기 어렵지만, I/O 집약적인 작업에서는 효율적입니다. 반면, 멀티프로세싱은 각 프로세스가 별도의 메모리 공간을 사용하므로 GIL의 영향을 받지 않고 CPU 집약적인 작업에서도 성능 향상을기대할 수 있습니다. 하지만 프로세스 간 통신이 필요한 경우 오버헤드가 발생할 수 있습니다.

아래에 추가적인 예시코드를 제공합니다.

멀티스레딩을 이용한 작업자 패턴:

import threading
import queue

def worker(q):
    while True:
        task = q.get()
        if task is None:
            break
        print(f'{threading.current_thread().name} is processing task: {task}')
        q.task_done()

task_queue = queue.Queue()

# 작업자 스레드 생성
worker_threads = []
for _ in range(5):
    t = threading.Thread(target=worker, args=(task_queue,))
    t.start()
    worker_threads.append(t)

# 작업 추가
for i in range(20):
    task_queue.put(f'Task {i}')

# 작업자 스레드 종료
for _ in range(5):
    task_queue.put(None)

for t in worker_threads:
    t.join()

print("All tasks completed.")

멀티프로세싱을 이용한 작업자 패턴:

import multiprocessing
import queue

def worker(q):
    while True:
        task = q.get()
        if task is None:
            break
        print(f'{multiprocessing.current_process().name} is processing task: {task}')
        q.task_done()

task_queue = multiprocessing.JoinableQueue()

# 작업자 프로세스 생성
worker_processes = []
for _ in range(5):
    p = multiprocessing.Process(target=worker, args=(task_queue,))
    p.start()
    worker_processes.append(p)

# 작업 추가
for i in range(20):
    task_queue.put(f'Task {i}')

# 작업자 프로세스 종료
for _ in range(5):
    task_queue.put(None)

for p in worker_processes:
    p.join()

print("All tasks completed.")


위의 예제에서 작업자 패턴을 사용하여 여러 스레드 또는 프로세스가 동시에 작업을 처리하도록 구현하였습니다. 큐에 작업을 추가하고, 각 작업자 스레드 또는 프로세스가 작업을 가져와 처리합니다. 작업이 완료되면 작업자 스레드 또는 프로세스를 종료합니다.

728x90

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

12.1 Tkinter 소개  (0) 2023.04.04
11.3 비동기 프로그래밍  (0) 2023.04.01
11.1 소켓 프로그래밍  (0) 2023.04.01
10.3 ORM(Object-Relational Mapping)  (0) 2023.03.31
10.2 NoSQL 데이터베이스  (0) 2023.03.31
Comments