home

Semaphore와 lock

threading.Semaphore()

세마포어는 대학시절 운영체제에서 배워 익숙한 이름입니다. 파이썬에서 세마포어는 동시에 접근할 수 있는 스레드의 수를 제한하는 기능입니다. 파라미터에 초기값을 지정할 수 있으며, 이 값이 허용하는 만큼 여러 스레드가 동시에 임계 구역에 들어갈 수 있습니다.

코드는 아주 간단해요.

import threading

sema = threading.Semaphore(3)

def limited_access():
    with sema:
        pass

초기 값에 N을 넣어준다면 최대 N개의 스레드에 동시 접근을 할 수 있게 됩니다.

threading.Lock()

락은 DB 락과 비슷하게 한 번에 하나의 스레드만 임계 구역에 들어갈 수 있도록 제한해줍니다. 익히 알고 있듯이 한 스레드가 Lock을 획득하면, 다른 스레드는 Lock이 해제될 때까지 대기합니다. 따라서 데드락이 발생할 수 있고, 락을 획득했으면 반드시 이를 풀어줘야 합니다.

컨텍스트 매니저를 사용하면 아주 간단하게 Lock을 제어할 수 있어요.

import threading

lock = threading.Lock()

def critical_section():
    with lock:
        pass

사실상 Semaphore(1)Lock() 과 같습니다.