select语句的默认情况继续执行

时间:2014-02-13 14:23:17

标签: loops go

类似: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语句来实现预期目标吗?

1 个答案:

答案 0 :(得分:3)

如果您在没有超时的情况下执行responder.Recv,您的代码将永久阻止,并且您将无法访问default部分。所以我想尝试设置超时;)