Python의 세마포어

Haider Ali 2023년6월21일
Python의 세마포어

이 가이드에서는 세마포어를 사용하여 파이썬에서 멀티스레딩을 처리하는 방법을 배웁니다. 스레드 및 제한된 양의 리소스에 대한 동기화된 액세스 권한을 갖는 방법은 무엇입니까?

세마포어

동기화 컨트롤러는 세마포어입니다. 세마포어는 제한된 수의 스레드 리소스에 대한 동기화된 액세스를 제공합니다.

세마포어는 현재 사용 가능한 리소스 수를 나타내는 변수로 볼 수 있습니다.

예를 들어, 세마포어 기능을 하는 쇼핑몰의 주차장은 주어진 레벨에서 여러 공간을 사용할 수 있습니다.

세마포어의 값은 사용 가능한 리소스보다 크거나 작아야 합니다. 획득해제 작업은 세마포어와 연결됩니다.

동기화에 사용되는 리소스 중 하나가 스레드에 의해 “획득"되면 세마포어의 값이 감소합니다. 동기화된 리소스 중 하나가 스레드에 의해 “해제"되면 세마포어의 값이 증가합니다.

Python의 세마포어

Python의 세마포어 개념 구현은 threading 모듈의 클래스를 사용합니다. Semaphore는 이 클래스의 이름입니다.

acquire()release() 함수는 모두 함수 생성자와 함께 Semaphore 클래스에 포함됩니다.

세마포어 카운트가 0보다 크면 acquire() 함수를 사용하여 카운트를 낮춥니다. 그렇지 않으면 카운트가 0보다 클 때까지 차단됩니다.

세마포어에 있는 스레드 중 하나는 release() 함수를 사용하여 깨어나며 이 또한 세마포어의 카운트를 증가시킵니다. 이제 세마포어의 구문을 이해합시다.

object_name = threading.Semaphore(count)

Semaphore 클래스 객체는 위의 구문에서 object_name으로 표시됩니다.

한 번에 액세스할 수 있는 스레드 수는 Semaphore 클래스의 count 인수로 지정됩니다. 이 매개변수의 기본값은 1입니다.

count 매개변수의 값은 스레드가 acquire() 기능을 사용할 때마다 하나씩 감소합니다. count 매개변수의 값은 스레드가 release() 기능을 사용할 때마다 하나씩 증가합니다.

이 명령문에 따르면 acquire() 메서드를 호출할 때마다 count 매개변수 값이 감소합니다. 그러나 release() 함수를 호출하면 count 매개변수의 값이 증가합니다. 다음 코드를 살펴보십시오.

# import threading module
import threading

# creating instance of semaphore
sema = threading.Semaphore(1)


def test():
    # appling semaphore
    print(f"Value Of Semaphore --> {sema._value}")
    sema.acquire()
    print(f"acquired lock --> {threading.current_thread().name}")
    print(f"Value Of Semaphore --> {sema._value}")
    print(f"release lock --> {threading.current_thread().name}")
    sema.release()
    print(f"Value Of Semaphore --> {sema._value}")


# initializing threads
t1 = threading.Thread(target=test)
t2 = threading.Thread(target=test)
t3 = threading.Thread(target=test)
# executing threads
t1.start()
t2.start()
t3.start()

위의 코드에서와 같이 count가 1로 설정되면 스레드가 동기화됩니다. 위 코드의 출력을 보면 첫 번째와 두 번째 스레드가 되고 세 번째 스레드는 획득해제 사이의 코드에 액세스할 수 있음을 알 수 있습니다.

Value Of Semaphore --> 1
Value Of Semaphore --> 1
acquired lock --> Thread-1 (test)
Value Of Semaphore --> 0
Value Of Semaphore --> 0
release lock --> Thread-1 (test)
Value Of Semaphore --> 1
acquired lock --> Thread-2 (test)
Value Of Semaphore --> 0
release lock --> Thread-2 (test)
Value Of Semaphore --> 1
acquired lock --> Thread-3 (test)
Value Of Semaphore --> 0
release lock --> Thread-3 (test)
Value Of Semaphore --> 1

count 값을 1에서 2로 변경하는 경우 한 번에 두 개의 스레드가 제한된 코드에 허용됩니다. 따라서 출력이 달라집니다.

Value Of Semaphore --> 2
acquired lock --> Thread-1 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 1
release lock --> Thread-1 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 1
acquired lock --> Thread-3 (test)
acquired lock --> Thread-2 (test)
Value Of Semaphore --> 0
Value Of Semaphore --> 0
release lock --> Thread-2 (test)
release lock --> Thread-3 (test)
Value Of Semaphore --> 1
Value Of Semaphore --> 2

세마포어가 스레드를 해제하는 데 걸리는 시간은 장치의 속도에 따라 달라지며 매번 달라집니다. 세마포어 인스턴스에서 count 값을 변경하여 위 코드를 테스트할 수 있습니다.

작가: Haider Ali
Haider Ali avatar Haider Ali avatar

Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.

LinkedIn