2016-09-19 5 views
0

私のコードは次のようになります。私はoutChannelにプロデューサーの書き込みがあり、(全体的な処理はXX秒以上かかる場合)、それからの読み取りにタイムアウトしたいgolangタイミングアウト使用してチャネルからの読み取り範囲

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

。 これを行う正しい方法は何でしょうか?私は(時:https://github.com/golang/go/wiki/Timeouts)構造を見てきたように

チャンネルから複数のcaseの読書でselectを使用するには、しかし、これは一度rangeを使用して適用することができないようです。

答えて

2

あなたは似た何かをしたいが、全体のループのための単一のタイムアウトチャネルを使用: `break`のみ` SELECT`から壊れること

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

。 forループを解除するには、ラベルまたは戻り値が必要です。 – JimB

+1

ありがとう、私はあまりにも速くそれを書きました。私はラベルを付け加えましたが、通常はこれが関数の中にあり、戻り値がはるかに読みやすくなると思います。 – djd

関連する問題