我正在嘗試在 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 關注
- 107 瀏覽
添加回答
舉報
0/150
提交
取消