使用通道超时的golang

使用通道超时的golang,第1张

使用通道超时的golang

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"}))}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5028690.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存