2017-12-25 9 views
0

私が複数の場合に、このようなselectを使用しています:無視された低速ケースを選択しますか?

for { 
    select { 
    case data:= <- highFreqChan: 
     // do something: 
    case <- time.After(time.Second * 5): 
     // send some heartbeat like data... 
    } 
} 

私はhighFreqChanは巨大なデータを得た場合、ハートビートの場合は入らないだろう、とストップがhighFreqChanにデータを送信するときに、ことがわかり、ハートビートのケースを生きて再びhighFreqChanが動作している間に、常にハートビートのケースに入る方法を教えてください。

+1

あなたは[時間に基づいてスリープ機能を書くのゴルーチン – bayrinat

+0

可能な複製を分離するためにハートビートを追加することができます。後](https://stackoverflow.com/questions/32937883/writing-sleep-function-based-on-time-after/32937957#32937957)。 – icza

答えて

8

あなたはそれが選択に達した 5秒後に期限切れになることを意味し、それが選択に到達した時点で評価されています意味の選択条件、...の一部としてtime.Afterを実行しています。したがって、highFreqChanに5秒間のデータがまったくない場合にのみそのケースに入ります。

あなたは、何かごと 5秒を行う代わりにtime.Tickerを使用し、そのようにしたい場合:

heartbeat := time.NewTicker(5 * time.Second) 
defer heartbeat.Stop() 
for { 
    select { 
    case data:= <- highFreqChan: 
     // do something: 
    case <- heartbeat.C: 
     // send some heartbeat like data... 
    } 
} 
関連する問題