2016-09-19 55 views
0
从信道读取

我的代码看起来是这样的:golang超时使用范围

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

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

正如我只看到结构(在:https://github.com/golang/go/wiki/Timeouts)使用selectcase■从渠道阅读,不过,这似乎并不适用使用range一次。

回答

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

是'break'只能从'select'打破。你需要一个标签或一个返回来从for循环中断。 – JimB

+1

谢谢,我写得太快了。我添加了一个标签,但我通常认为这将在func里面,并且返回将更加可读。 – djd