我的代码如下所示:
outChannel := make(chan struct{})
...
for out := range outChannel {
...
}
我有一个写入outChannel
的制作人,并希望在阅读时超时(如果整体处理时间超过XX秒)。
这样做的正确方法是什么?
由于我只看到使用select
构建(在https://github.com/golang/go/wiki/Timeouts)并且从频道中读取了多个case
,但是,这似乎不适用一次使用{{ 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
}
}