[파이썬] 뮤텍스(Mutex)와 세마포어(Semaphore)

Introduction

뮤텍스(Mutex)와 세마포어(Semaphore)는 병행성(concurrency) 문제를 해결하는데 사용되는 동기화 기법입니다. 이러한 기법들은 프로그래밍에서 동시에 여러 작업을 수행하는 상황에서 상호배제(mutual exclusion)와 리소스 관리(resource management)를 위해 필요합니다. 이 글에서는 뮤텍스와 세마포어의 개념과 Python에서의 구현 방법에 대해 살펴보겠습니다.

뮤텍스(Mutex)

뮤텍스는 오직 하나의 쓰레드만이 임계영역(critical section)에 진입할 수 있도록 하는 동기화 기법입니다. 임계영역은 동시에 여러 쓰레드가 접근해서는 안 되는 공유 데이터나 리소스에 대한 코드 영역을 말합니다. 일반적으로 뮤텍스는 락(lock) 또는 semaphore와 비슷한 역할을 하지만, 뮤텍스는 소유에 기반하여 접근을 허용하거나 차단하는 반면에 세마포어는 계수(count)에 기반하여 접근을 허용하거나 차단합니다.

뮤텍스는 Python의 threading 모듈을 사용하여 구현할 수 있습니다. 다음은 뮤텍스를 사용하여 임계영역에 대한 상호배제를 구현하는 예제 코드입니다.

import threading

# 뮤텍스 객체 생성
mutex = threading.Lock()

def critical_section():
    # 임계영역에 진입하기 전에 뮤텍스 락 획득
    mutex.acquire()
    
    try:
        # 임계영역 코드 실행
        # ...
    finally:
        # 임계영역 코드 실행 후에 뮤텍스 락 해제
        mutex.release()

세마포어(Semaphore)

세마포어는 동시에 진입할 수 있는 쓰레드의 개수를 제한하는 동기화 기법입니다. 세마포어는 주로 리소스의 수를 관리하는 용도로 사용됩니다. 세마포어는 내부적으로 계수(count)를 가지며, 필요에 따라 값을 증가시키거나 감소시켜 쓰레드의 진입을 허용하거나 차단합니다.

Python에서 세마포어를 사용하기 위해서는 threading 모듈의 Semaphore 클래스를 사용합니다. 다음은 세마포어를 사용하여 동시에 최대 3개의 쓰레드만이 접근할 수 있는 상호배제를 구현하는 예제 코드입니다.

import threading

# 세마포어 객체 생성 (최대 3개의 쓰레드 허용)
semaphore = threading.Semaphore(3)

def critical_section():
    # 임계영역 진입 시 세마포어 획득
    semaphore.acquire()
    
    try:
        # 임계영역 코드 실행
        # ...
    finally:
        # 임계영역 코드 실행 후 세마포어 해제
        semaphore.release()

결론

뮤텍스와 세마포어는 병행성 문제를 해결하기 위한 효율적인 동기화 기법입니다. Python에서는 threading 모듈의 Lock과 Semaphore 클래스를 활용하여 뮤텍스와 세마포어를 구현할 수 있습니다. 이를테면, 뮤텍스는 오직 하나의 쓰레드만이 접근할 수 있도록 해주고, 세마포어는 동시에 일정 개수의 쓰레드만이 접근할 수 있도록 허용합니다. 이러한 기법들을 잘 활용하여 병행성을 관리하면 효율적이고 안전한 프로그래밍을 구현할 수 있습니다.