2016-09-19 3 views
0

Мой код выглядит следующим образом:времени golang из чтения из канала, используя диапазон

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

У меня есть продюсер писать на outChannel и хотел бы тайм-аут при чтении из него (если общая обработка занимает больше XX секунд) , Каким будет правильный способ?

Как я только видел конструкцию (по адресу: https://github.com/golang/go/wiki/Timeouts) с использованием select с многократными case сек чтение из каналов, однако, это, кажется, не применяется один раз 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