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