为了账号安全,请及时绑定邮箱和手机立即绑定

可执行程序在跨越空通道时抢先退出

可执行程序在跨越空通道时抢先退出

Go
元芳怎么了 2023-03-21 15:09:37
我最近遇到了一个编码练习,我在 python 中解决了这个问题,我不得不在其中移植一个“算法”。我不知道它是怎么称呼的,这就是我描述它的原因:每一行都是通过按顺序打印的相同数字的数量和相关数字对前一行的描述。这是一个例子:111211211111221312211etc我开始学习 Go 及其通道和并发功能。所以我回到这个练习,试图与 Go 并行更有效地解决它。这是我到目前为止得到的:package mainfunc main() {    channel := make(chan uint8)    go treeCalcRoutine(channel, 0)    channel <- 1    close(channel) //defer is not an option in this case because the channel has     //to be closed before main exits}func treeCalcRoutine(in <-chan uint8, generation int) {    if generation > 10 {        return // return after 10 recursive iterations    }    out := make(chan uint8)    defer close(out)    num := uint8(1)    previous := <-i    go treeCalcRoutine(out, generation+1)    for val := range in {        switch {        case val == previous:            num++        default:            num = uint8(1)            out <- num            out <- val        }        previous = val    }    out <- num    out <- previous}在尝试使用Delve调试程序时,我发现程序在尝试遍历空/关闭通道时无一例外地退出(并且退出状态为 0)。在这种情况下,我希望程序完全跳过 for 循环。我仍然想自己解决这个挑战,所以如果有人能给我指出正确的方向而不是提供一个有效的解决方案,我将不胜感激。此外,请指出任何其他可以做得更好的问题/案例(如限制generation)。编辑:由于人们要求我发布错误:由于某种原因根本没有错误。一旦到达 for 循环,程序就会退出。
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

所以问题实际上不是 for 循环在遇到关闭的通道时退出,而是主例程在那个确切的时间退出,这导致所有其他 goroutine 也终止。在这种情况下,我被建议使用等待组。



查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号