栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

使用通道超时的golang

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用通道超时的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"}))}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/413141.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号