golang使用范围从通道读取超时

Pet*_*vic 4 timeout channel go

我的代码如下所示:

outChannel := make(chan struct{})
...
for out := range outChannel {
   ...
}
Run Code Online (Sandbox Code Playgroud)

我有一个生产者写入outChannel并希望在读取时超时(如果整体处理时间超过 XX 秒)。这样做的正确方法是什么?

由于我只看到构造(在: https: //github.com/golang/go/wiki/Timeouts)与从通道读取的select多个s 一起使用,但是,一旦使用,这似乎不适用。caserange

djd*_*djd 6

您想做类似的事情,但对整个循环使用单个超时通道:

const timeout = 30 * time.Second
outc := make(chan struct{})
timec := time.After(timeout)

RangeLoop:
for {
    select {
    case <-timec:
        break RangeLoop // timed out
    case out, ok := <-outc:
        if !ok {
            break RangeLoop // Channel closed
        }
        // do something with out
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我写得太快了。我添加了一个标签,但我想通常这会在一个 func 中,并且 return 会更具可读性。 (2认同)