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

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

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

Go
森栏 2023-07-17 15:15:02
我正在尝试在 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:        }    }}我希望它在打印日志消息并返回后返回。
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

这段代码有很多问题,主要是使用for/的紧密循环select可能不允许其他 goroutine 在通道上发送。由于default箱子是空的并且select只有一个,因此不需要case整个箱子。select以下代码可以正确运行:


backOffChan := make(chan struct{})

go func() {

    time.Sleep(1 * time.Millisecond)

    backOffChan <- struct{}{}

}()

for range backOffChan {

    d := time.Duration(10 * time.Millisecond)

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

    select {

    case <-time.After(d):

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

        return

    }

}

这将等到backOffChan收到消息而不烧紧循环。


(请注意,此代码还解决了使用log.Println格式化指令的问题 - 这些问题已更正为log.Printf)。


在这里查看它的实际效果:https ://play.golang.org/p/ksAzOq5ekrm


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

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信