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

Go中的频道死锁

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

Go中的频道死锁

虽然您的解决方案可能会起作用,但我对此并不满意。

首先,您需要更改通道大小以使其起作用这一事实表明存在潜在的问题/错误。现在,每次您要启动另一个时

doSomething
,都必须记住要更改通道的长度。

其次,您要等到所有goroutine完成后才能从通道读取。这是一种“浪费”,因为通道范围循环的要点之一是您不必等到所有项目生成(写入通道)后,就可以立即处理这些项目。他们已经准备好了。

所以我会像这样写你的代码

func main() {    c := make(chan int)    var wg sync.WaitGroup    wg.Add(3)    go func() {        doSomething(c)        defer wg.Done()    }()    go func() {        doSomething(c)        defer wg.Done()    }()    go func() {        doSomething(c)        defer wg.Done()    }()    go func() {        wg.Wait()        defer close(c)    }()    for v := range c {        fmt.Print(v)    }}func doSomething(c chan<- int) {    c <- 1}

https://play.golang.org/p/T3dfiztKot

请注意,等待和关闭通道现在是如何在其自己的goroutine中进行的-这允许立即开始在通道上进行迭代(该通道现在没有缓冲!)。

我还更改了代码,以

WaitGroup
使它永远不会离开声明它的范围(即,它不用作参数),这是我个人的喜好。我相信它使代码更易于遵循和理解。



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

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

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