check(u)将在 当前的
goroutine(即正在运行的goroutine)中休眠
func。该
select语句仅在返回后才能正确运行,并且到那时,这两个分支都可以运行,并且运行时可以选择任何一个它。
您可以通过
check在另一个goroutine中运行来解决该问题:
package mainimport "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(1 * time.Second): ch <- false } }(url) } return <-ch}func main() { fmt.Println(IsReachable([]string{"url1"}))}
看来您想检查一组URL的可达性,如果其中一个可用,则返回true。如果超时时间比启动goroutine所需的时间长,则可以通过对所有URL设置一个超时来简化此过程。但是我们需要确保通道足够大以容纳所有检查的答案,否则那些不能“赢”的检查将永远被阻塞:
package mainimport "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"}))}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)