即使经过很短的时间,Go 程序也会永远休眠。

我正在尝试在 Go 中构建一些缺少的信号量。尽管当通道接收到信号时它就会永远休眠。


我尝试过改变睡眠方式和睡眠时间,但它仍然永远停止。


这是我尝试过的表示:


func main() {

    backOffChan := make(chan struct{})

    go func() {

        time.Sleep(2)

        backOffChan <- struct{}{}

    }()

    for {

        select {

        case <-backOffChan:

            d := time.Duration(5 * time.Second)

            log.Println("reconnecting in %s", d)

            select {

            case <-time.After(d):

                log.Println("reconnected after %s", d)

                return

            }

        default:

        }

    }

}

我希望它在打印日志消息并返回后返回。


森栏
浏览 74回答 1
1回答

暮色呼如

这段代码有很多问题,主要是使用for/的紧密循环select可能不允许其他 goroutine 在通道上发送。由于default箱子是空的并且select只有一个,因此不需要case整个箱子。select以下代码可以正确运行:backOffChan := make(chan struct{})go func() {&nbsp; &nbsp; time.Sleep(1 * time.Millisecond)&nbsp; &nbsp; backOffChan <- struct{}{}}()for range backOffChan {&nbsp; &nbsp; d := time.Duration(10 * time.Millisecond)&nbsp; &nbsp; log.Printf("reconnecting in %s", d)&nbsp; &nbsp; select {&nbsp; &nbsp; case <-time.After(d):&nbsp; &nbsp; &nbsp; &nbsp; log.Printf("reconnected after %s", d)&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }}这将等到backOffChan收到消息而不烧紧循环。(请注意,此代码还解决了使用log.Println格式化指令的问题 - 这些问题已更正为log.Printf)。在这里查看它的实际效果:https ://play.golang.org/p/ksAzOq5ekrm
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go