我正在尝试在 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
- 1 回答
- 0 关注
- 73 浏览
添加回答
举报
0/150
提交
取消