2016-09-19 102 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