退出Go中空流式http json goroutine的解码

退出Go中空流式http json goroutine的解码,go,Go,我有一个长寿命的流式json响应,我正在goroutine中处理它,如下所示。我正在使用退出通道定期退出goroutine。退出在数据流动时(在下一个循环中)效果很好,但是,在没有任何数据流的情况下,decoder.Decode会暂停执行,等待下一行json,这会暂停退出。关于如何优雅地退出的建议 quit := make(chan bool) decoder := json.NewDecoder(response.Body) // response.Body is streaming jso

我有一个长寿命的流式json响应,我正在goroutine中处理它,如下所示。我正在使用退出通道定期退出goroutine。退出在数据流动时(在下一个循环中)效果很好,但是,在没有任何数据流的情况下,decoder.Decode会暂停执行,等待下一行json,这会暂停退出。关于如何优雅地退出的建议

quit := make(chan bool)

decoder := json.NewDecoder(response.Body) // response.Body is streaming json

go func() {
  for {
    select {

    case <-quit:
      return

    default:
      decoder.Decode(&myStruct) // this blocks when there's no data 

      process myStruct...

    }
  }
}()

... quit <- true // stop execution as needed
quit:=make(chan bool)
解码器:=json.NewDecoder(response.Body)//response.Body是流式json
go func(){
为了{
挑选{

case不能中断阻塞读取。如果要中断响应正文的读取,需要取消http请求。这将关闭连接,导致阻塞的
io.Reader
返回
io.EOF


创建一个“可取消的”使用该方法请求,并为其提供一个。

阻塞读取块。是否有特殊原因需要它立即退出而不是下次读取?它在等待IO时几乎不消耗任何资源。@Adrian,因为它可能在读取之间等待很长时间,甚至是永远。在我的用例中,我需要退出,重新配置,并定期重新启动。这不会阻止应用程序关闭-当
main()
退出时,无论发生什么情况,应用程序都将关闭。感谢@JimB取消上下文工作得非常好。我还喜欢Go如何轻松设置和使用: