gpt4 book ai didi

Go 程序即使在经过很短的时间后也会永远休眠。持续时间

转载 作者:数据小太阳 更新时间:2023-10-29 03:32:12 25 4
gpt4 key购买 nike

我正在尝试在 Go 中构建一些信号量。尽管当 channel 接收到信号时,它会永远休眠。

我试过改变 sleep 方式和 sleep 持续时间,但它仍然永远停止。

这里是我尝试过的表示:

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:
}
}
}

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

谢谢!

最佳答案

这段代码有很多问题,主要是使用 for/select 的紧密循环可能不允许其他 goroutine 在 channel 上发送。由于 default case 是空的,而 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

关于Go 程序即使在经过很短的时间后也会永远休眠。持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57696867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com