猿问

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

介绍:

我刚刚开始学习Go语言,并达到了关于并发的课程。

我为自己发明了一个小任务,试图实现我所学到的关于关闭戈鲁廷的知识。

问题:

如果我们关闭信道,它将始终在语句中被选中,这是向所有戈鲁丁广播取消信号的好方法。caseselect

下面我有2个戈鲁丁和一个从未被接收的频道。quit

操场上的代码超时。

如果我注释掉戈鲁丁中的部分,那么信号就会被接收到。defaultquit

问题:

我真的不明白为什么会发生这种情况以及如何解决它,尽管我正在尝试。
有人可以向我解释问题是什么,并就如何解决它提供一些建议吗?

package main


import (

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

}


德玛西亚99
浏览 98回答 1
1回答

RISEBY

此代码在现实生活中工作正常;它只是与游乐场的“假时间”不兼容,因为并且不阻塞,并且运行时无法决定在到期之前运行每个迭代的次数(基本上,打印需要零模拟的壁钟时间,因此它们试图产生无限的输出,并且您达到了游乐场的CPU使用限制,而根本没有提前过壁式时钟时间)。在真实的机器上,你只能在有限的时间内打印有限的输出,你会得到合理的行为。positive_numbersnegative_numbersSleep在游乐场中,如果您在每次打印后添加类似的东西,则强制假时钟向前移动,程序也会终止。time.Sleep(time.Millisecond)
随时随地看视频慕课网APP

相关分类

Go
我要回答