golang使用范围从频道读出超时

时间:2016-09-19 21:27:43

标签: go timeout channel

我的代码如下所示:

outChannel := make(chan struct{})
...
for out := range outChannel {
   ...
}

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

由于我只看到使用select构建(在https://github.com/golang/go/wiki/Timeouts)并且从频道中读取了多个case,但是,这似乎不适用一次使用{{ 1}}。

1 个答案:

答案 0 :(得分:2)

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

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
    }
}