>백엔드 개발 >Golang >채널을 사용할 때 Golang 시간 초과 사례가 트리거되지 않는 이유는 무엇입니까?

채널을 사용할 때 Golang 시간 초과 사례가 트리거되지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-18 11:38:15820검색

Why Doesn't My Golang Timeout Case Trigger When Using Channels?

채널이 있는 Golang에서 시간 초과 사례가 트리거되지 않음

제공된 코드에서 시간 초과 사례는 select 문과 time.After() 호출을 사용하여 구현됩니다. 그런데 timeout 경우는 실행되지 않습니다.

설명

이유는 time.After() 함수가 호출될 때마다 새로운 채널을 생성하기 때문입니다. select 문이 c1 채널(첫 번째 for 루프)에서 값을 수신하면 기존 time.After() 채널이 삭제됩니다. 따라서 시간 초과 사례에는 값을 받을 기회가 없습니다.

해결 방법

이 문제를 해결하려면 for 루프 외부에서 time.After() 채널을 한 번만 생성하세요. 이렇게 하면 실행 전반에 걸쳐 동일한 채널이 타임아웃 케이스에 사용됩니다.

수정된 코드는 다음과 같습니다.

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

    go func() {
        for {
            time.Sleep(1500 * time.Millisecond)
            c1 <- 10
        }
    }()

    timeout := time.After(2000 * time.Millisecond)
    for {
        select {
        case i := <-c1:
            fmt.Println(i)
        case <-timeout:
            fmt.Println("TIMEOUT")
        }
    }

    fmt.Scanln()
}

이 수정을 통해 타임아웃 케이스는 2초 후에 성공적으로 실행됩니다. , 해당 기간 내에 c1 채널에서 값이 수신되지 않는 한.

위 내용은 채널을 사용할 때 Golang 시간 초과 사례가 트리거되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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