类似:golang: goroute with select doesn't stop unless I added a fmt.Print()
我在go中编写代码,其中goroutine一直在接收和处理套接字上的请求。为了停止执行当前goroutine,我将true
发送到来自其他goroutine的通道,当前goroutine继续在select
语句中监听。
但问题是,即使在通道上发送信号后,default
块仍会永久执行。并且永远不会执行case
块。以下是我遇到问题的代码段。
for {
select{
//goroutine should return when something is received on channel 's.stopInbox'
case <-s.stopInbox:
fmt.Println("stopInbox")
return
//keep receiving and processing requests until anything is received on channel 's.stopInbox'
default:
fmt.Println("default case")
msg, err := responder.Recv(0)
if err != nil {
fmt.Println("Error receiving message", err.Error())
break
}
envelope := msgToEnvelope(msg)
s.inbox <- &envelope
}
}
我已经搜索了问题并找到了解决方案
使用默认语句select会在每次从通道中读取任何内容时运行默认语句。因此,调度程序永远不会有机会安排另一个goroutine。将
fmt.Print
语句放入允许调度程序安排其他goroutine。
根据建议,我尝试在默认情况下放置一个print语句,我也尝试在默认情况下放置一个sleep语句。但没有任何效果。
有没有办法让这项工作?也可以通过完全避免select
语句来实现预期目标吗?
答案 0 :(得分:3)
如果您在没有超时的情况下执行responder.Recv
,您的代码将永久阻止,并且您将无法访问default
部分。所以我想尝试设置超时;)