객체세마포어
섬유 세마포어 객체
세마포어 객체는 acquire나 wait를 호출한 후 1씩 감소하고, release나 post를 호출한 후에는 1씩 증가하는 내부 카운터를 관리합니다. 카운터는 음수로 감소하지 않습니다. 획득하고 기다릴 때 값이 0이라는 것을 발견하면 다른 파이버가 릴리스 또는 포스트를 통해 카운터 값을 늘릴 때까지 현재 파이버를 절전 모드로 유지하기 때문입니다.
세마포어가 일반적으로 사용되는 경우는 리소스의 동시 사용과 생산자/소비자 모델의 적용을 제한하는 것입니다.
리소스의 동시 사용을 제한하기 위해 데이터베이스 요청을 예로 들어 보겠습니다.
1
2
3
4
5
6
7
8
9
10var maxconnections = 5;
var l = new coroutine.Semaphore(maxconnections);
......
l.acquire();
var conn = connectdb()
.....
conn.close();
l.release();
생산자/소비자 패턴은 일반적으로 대기열과 함께 세마포어를 사용합니다. 생산자는 큐에 데이터를 추가하고 신호를 게시하고, 소비자는 먼저 신호를 기다렸다가 신호를 받은 후 큐로 가서 데이터를 쿼리합니다.
상속관계
건설자
Semaphore
세마포 생성자
1new Semaphore(Integer value = 1);
호출 매개변수:
- value: 정수, 카운터 초기값
멤버 함수
wait
세마포어를 기다리다
1Boolean Semaphore.wait(Integer timeout = -1);
호출 매개변수:
- timeout: 정수, 시간 초과를 밀리초 단위로 지정합니다. 기본값은 -1이며, 이는 시간 초과가 발생하지 않음을 의미합니다.
결과 반환:
- Boolean, 획득이 성공하면 true를 반환하고, 시간이 초과되면 false를 반환합니다.
post
release()와 동일하게 세마포어를 해제합니다.
1Semaphore.post();
trywait
신호 획득을 시도합니다. 획득할 수 없는 경우 즉시 반환되고 false를 반환하며 이는 획득(false)과 동일합니다.
1Boolean Semaphore.trywait();
결과 반환:
- Boolean, 획득이 성공하면 true를 반환하고, 시간이 초과되면 false를 반환합니다.
acquire
잠금 소유권 가져오기
1Boolean Semaphore.acquire(Boolean blocking = true);
호출 매개변수:
- blocking: 부울, 기다릴지 여부를 지정합니다. true인 경우 대기합니다. 기본값은 true입니다.
결과 반환:
- Boolean, 잠금이 성공적으로 획득되었는지 여부를 반환합니다. true는 획득에 성공했음을 나타냅니다.
획득 메소드는 잠금의 소유권을 획득하는데 사용되며, 잠금이 획득 가능한 상태일 때 이 메소드는 즉시 true를 반환합니다.
잠금을 획득할 수 없고 차단이 true인 경우 현재 Fiber는 절전 모드로 전환되고, 다른 Fiber가 잠금을 해제하면 이 메서드는 true를 반환합니다.
잠금을 획득할 수 없고 차단이 false인 경우 메서드는 false를 반환합니다.
release
잠금 소유권 해제
1Semaphore.release();
이 방법은 잠금 소유권을 해제하거나 현재 파이버가 잠금을 소유하지 않은 경우 오류를 발생시킵니다.
count
현재 대기 중인 작업 수 쿼리
1Integer Semaphore.count();
결과 반환:
- Integer, 작업 수를 반환합니다.
toString
객체의 문자열 표현을 반환하며 일반적으로 "[Native Object]"를 반환하며 객체 자체의 특성에 따라 다시 구현될 수 있습니다.
1String Semaphore.toString();
결과 반환:
- String, 객체의 문자열 표현을 반환합니다.
toJSON
객체의 JSON 형식 표현을 반환하며 일반적으로 객체에 의해 정의된 읽을 수 있는 속성 컬렉션을 반환합니다.
1Value Semaphore.toJSON(String key = "");
호출 매개변수:
- key: 문자열, 사용되지 않음
결과 반환:
- Value, 직렬화 가능한 JSON을 포함하는 값을 반환합니다.