>  기사  >  백엔드 개발  >  Go 채널을 사용할 때 시간 초과 사례가 실행되지 않는 이유는 무엇입니까?

Go 채널을 사용할 때 시간 초과 사례가 실행되지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-10 08:19:02812검색

Why Does the Timeout Case Not Execute When Using Go Channels?

Go 채널에서 시간 제한 사용

Go에서는 고루틴과 채널이 강력한 동시성 모델을 제공합니다. 그러나 이러한 메커니즘을 사용할 때는 잠재적인 문제를 방지하기 위해 시간 초과를 올바르게 처리하는 것이 중요합니다.

채널에서 시간 초과를 사용할 때 한 가지 일반적인 질문이 발생합니다. 시간 초과 사례가 실행되지 않는 이유는 무엇입니까? 이에 대해 알아보고 적절한 시간 초과 처리를 보장하기 위한 솔루션을 제공하겠습니다.

원본 코드:

import "fmt"
import "time"

func check(u string) bool {
    time.Sleep(4 * time.Second)
    return true
}

func IsReachable(urls []string) bool {

    ch := make(chan bool, 1)
    for _, url := range urls {
        go func(u string) {
            select {
            case ch <- check(u):
            case <-time.After(time.Second):
                ch <- false
            }
        }(url)
    }
    return <-ch
}
func main() {
    fmt.Println(IsReachable([]string{"url1"}))
}

문제:

이 코드를 사용하면 실제 연결에 관계없이 모든 URL이 항상 연결 가능한 것으로 보고됩니다. 검사 기능이 현재 고루틴을 차단하고 있기 때문에 타임아웃 사례가 실행되지 않습니다.

해결책 1: 별도의 고루틴에서 검사 기능을 실행합니다:

이 문제를 해결하려면 , 검사 기능을 별도의 고루틴으로 이동하고 다른 채널을 사용하여 통신합니다. 결과:

package main

import "fmt"
import "time"

func check(u string, checked chan<- bool) {
    time.Sleep(4 * time.Second)
    checked <- true
}

func IsReachable(urls []string) bool {

    ch := make(chan bool, 1)
    for _, url := range urls {
        go func(u string) {
            checked := make(chan bool)
            go check(u, checked)
            select {
            case ret := <-checked:
                ch <- ret
            case <-time.After(time.Second):
                ch <- false
            }
        }(url)
    }
    return <-ch
}
func main() {
    fmt.Println(IsReachable([]string{"url1"}))
}

해결책 2: 모든 URL에 대해 단일 시간 제한 시작:

또는 하나의 성공적인 확인을 기반으로 연결 가능성을 보고하는 것이 목표인 경우, 모든 항목에 대해 단일 시간 초과를 사용하여 시간 초과 처리를 단순화하는 것을 고려하십시오. URL:

package main

import "fmt"
import "time"

func check(u string, ch chan<- bool) {
    time.Sleep(4 * time.Second)
    ch <- true
}

func IsReachable(urls []string) bool {
    ch := make(chan bool, len(urls))
    for _, url := range urls {
        go check(url, ch)
    }
    time.AfterFunc(time.Second, func() { ch <- false })
    return <-ch
}
func main() {
    fmt.Println(IsReachable([]string{"url1", "url2"}))
}

시간 초과 처리를 올바르게 처리함으로써 개발자는 Go 코드가 URL 연결 가능성을 정확하게 반영하여 보다 안정적이고 일관된 애플리케이션 환경을 제공할 수 있습니다.

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

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