> 백엔드 개발 > Golang > Go에서 '버퍼 잠금'을 만들 수 있나요?

Go에서 '버퍼 잠금'을 만들 수 있나요?

Mary-Kate Olsen
풀어 주다: 2024-11-17 14:33:02
원래의
660명이 탐색했습니다.

Can You Create a

세마포어: Go의 버퍼 잠금 패턴

Go는 버퍼 채널 개념을 도입하여 버퍼가 채워질 때까지 채널이 차단 없이 메시지를 수락할 수 있도록 합니다. 이는 다음과 같은 질문을 제기합니다. 유사한 패턴을 잠금 메커니즘에 적용하여 특정 수의 클라이언트에 대한 리소스 액세스를 제한하는 "버퍼 잠금"을 생성할 수 있습니까?

해결책: 세마포

기본 요소 클라이언트 동시성을 제한하면서 공유 리소스에 대한 액세스를 관리하도록 설계된 것을 세마포라고 합니다. Go에서는 버퍼링된 채널을 사용하여 세마포어를 쉽게 구현할 수 있습니다.

구현

다음 코드 조각을 고려하세요.

var semaphore = make(chan struct{}, 4) // limit to 4 concurrent users

func f() {
    // Acquire the lock. Blocks until at most 3 other goroutines are already executing f.
    semaphore <- struct{}{}

    // Release the lock when done.
    defer func() { <-semaphore }()

    // Perform the protected work...
}
로그인 후 복사

여기서 세마포어는 버퍼링된 채널로 표시됩니다. 크기 4로, f 함수를 최대 4번까지 동시에 호출할 수 있습니다. <-세마포어 작업은 채널에서 값을 검색하여 값이 사용 가능해질 때까지 차단합니다. <-세마포어 작업은 값을 다시 채널로 해제하여 다른 고루틴이 잠금을 획득할 수 있도록 합니다.

결론

세마포어는 Go에서 버퍼 잠금을 구현하기 위한 간단하고 효과적인 메커니즘을 제공합니다. 제한된 수의 클라이언트에 의해 공유 리소스에 대한 액세스가 통제됩니다.

위 내용은 Go에서 '버퍼 잠금'을 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿