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 중국어 웹사이트의 기타 관련 기사를 참조하세요!