2017-12-25 4 views
0

Ich verwende einen solchen select auf mehreren Fällen:select ignored slow case?

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

Ich finde, dass, wenn highFreqChan riesige Daten bekam, wird nicht der Herzschlag Fall eintreten, und wenn Stoppdaten highFreqChan, den Herzschlag Fall wieder lebendig Senden , wie man es immer den Herzschlagfall eingibt, während das highFreqChan immer noch arbeitet?

+1

Sie können den Herzschlag hinzufügen goroutine – bayrinat

+0

Mögliche Duplikat zu trennen [Schreiben Sleep-Funktion basierend auf der Zeit. Nachher] (https://stackoverflow.com/questions/32937883/writing-sleep-function-based-on-time-after/32937957#32937957). – icza

Antwort

8

Sie laufen time.After als Teil der Select-Bedingung, was bedeutet, dass es zum Zeitpunkt der Auswahl ausgewertet wird ... was bedeutet, dass es 5 Sekunden abläuft, nachdem die Auswahl erreicht ist. Sie werden diesen Fall nur eingeben, wenn highFreqChan 5 Sekunden lang keine Daten enthält.

Wenn Sie etwas alle 5 Sekunden tun möchten, verwenden Sie eine time.Ticker statt, etwa so:

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