>백엔드 개발 >Golang >Go에서 전체 버퍼링된 채널을 어떻게 감지할 수 있나요?

Go에서 전체 버퍼링된 채널을 어떻게 감지할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-12-09 09:06:11140검색

How Can I Detect a Full Buffered Channel in Go?

풀 버퍼링된 채널 감지

Go에서 버퍼링된 채널에는 최대 용량 제한이 있습니다. 버퍼링된 채널이 용량에 도달하면 추가 항목을 보내면 일반적으로 작업이 차단됩니다. 그러나 차단하는 대신 항목을 삭제하는 것을 선호하는 상황이 있습니다.

기본값으로 Select 문 사용

버퍼된 채널이 가득 찼는지 확인하는 한 가지 방법 기본 절과 함께 select 문을 사용하는 것입니다. 예는 다음과 같습니다.

package main

import "fmt"

func main() {
    ch := make(chan int, 1)

    // Fill it up
    ch <- 1

    select {
    case ch <- 2: // Put 2 in the channel unless it is full
    default:
        fmt.Println("Channel full. Discarding value")
    }
}

이 예에서 select 문에는 두 가지 사례가 있습니다.

  • 첫 번째 사례는 값 2를 채널로 보내려고 시도합니다. 채널이 꽉 차 있지 않으면 작업이 성공합니다.
  • 즉시 실행할 수 있는 케이스가 없으면 기본 케이스가 실행됩니다. 채널이 이미 가득 차 있으므로 기본 사례가 트리거되고 값 2가 삭제됩니다.

출력:

Channel full. Discarding value

채널 크기 확인

전체 채널을 감지하는 또 다른 방법은 다음을 사용하여 크기를 확인하는 것입니다. len(ch)을 입력하고 cap(ch)을 사용하여 용량과 비교합니다.

if len(ch) == cap(ch) {
    // Channel was full, but might not be by now
} else {
    // Channel wasn't full, but might be by now
}

이 접근 방식은 다음 가능성으로 인해 if 블록이 입력될 때까지 결과가 유효할 것이라고 보장하지 않습니다. 크기 확인과 if 문 사이의 채널 활동.

위 내용은 Go에서 전체 버퍼링된 채널을 어떻게 감지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.