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

关闭停止通道不会停止戈鲁丁

关闭停止通道不会停止戈鲁丁

Go
德玛西亚99 2022-09-19 20:47:11
介绍:我刚刚开始学习Go语言,并达到了关于并发的课程。我为自己发明了一个小任务,试图实现我所学到的关于关闭戈鲁廷的知识。问题:如果我们关闭信道,它将始终在语句中被选中,这是向所有戈鲁丁广播取消信号的好方法。caseselect下面我有2个戈鲁丁和一个从未被接收的频道。quit操场上的代码超时。如果我注释掉戈鲁丁中的部分,那么信号就会被接收到。defaultquit问题:我真的不明白为什么会发生这种情况以及如何解决它,尽管我正在尝试。有人可以向我解释问题是什么,并就如何解决它提供一些建议吗?package mainimport (    "fmt"    "sync"    "time")func positive_numbers(quit chan struct{}, wg *sync.WaitGroup) {    defer wg.Done()    i := 1    for {        select {        case <-quit:            fmt.Println("[+]Quiting...")            return        default:            fmt.Printf("%v ", i)            i++        }    }}func negative_numbers(quit chan struct{}, wg *sync.WaitGroup) {    defer wg.Done()    i := -1    for {        select {        case <-quit:            fmt.Println("[-]Quiting...")            return        default:            fmt.Printf("%v ", i)            i--        }    }}func main() {    quit := make(chan struct{})    wg := sync.WaitGroup{} // so we can wait for all goroutines to finish    wg.Add(2)    go positive_numbers(quit, &wg)    go negative_numbers(quit, &wg)    go func(quit chan struct{}) {        defer close(quit)        time.Sleep(1 * time.Second)    }(quit)    wg.Wait()}
查看完整描述

1 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

此代码在现实生活中工作正常;它只是与游乐场的“假时间”不兼容,因为并且不阻塞,并且运行时无法决定在到期之前运行每个迭代的次数(基本上,打印需要零模拟的壁钟时间,因此它们试图产生无限的输出,并且您达到了游乐场的CPU使用限制,而根本没有提前过壁式时钟时间)。在真实的机器上,你只能在有限的时间内打印有限的输出,你会得到合理的行为。positive_numbersnegative_numbersSleep

在游乐场中,如果您在每次打印后添加类似的东西,则强制假时钟向前移动,程序也会终止。time.Sleep(time.Millisecond)


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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