2016-06-08 5 views
1

Ich habe einen Auswahlblock, der auf 2 Kanälen, einen Ticker und einen Timer hört:Warum wird Zeit.Nach dem Auslösen nie, wenn es mit einem Ticker in einem Auswahlblock gepaart ist?

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 

    ticker := time.NewTicker(5 * time.Second) 
    for { 
     select { 
     case z := <-ticker.C: 
      fmt.Printf("tick %d\n", z) 

     case <-time.After(12 * time.Second): 
      fmt.Println("12 seconds elapsed!") 
     } 
    } 
} 

Wenn ich den Code ausführen, der time.After Fall nie läuft, aber der Ticker korrekt funktioniert.

Wenn ich den Ticker entfernen, time.After Feuer richtig:

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 

    for { 
     select { 
     case <-time.After(12 * time.Second): 
      fmt.Println("12 seconds elapsed!") 
     } 
    } 
} 

Es funktioniert richtig, wenn ich einen Timer statt time.After verwendet:

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 

    ticker := time.NewTicker(5 * time.Second) 
    timer := time.NewTimer(12 * time.Second) 
    for { 
     select { 
     case z := <-ticker.C: 
      fmt.Printf("tick %d\n", z) 

     case <-timer.C: 
      fmt.Println("12 seconds elapsed!") 
     } 
    } 
} 

Warum passiert das das?

+0

Ich verstehe die Frage nicht. 12sec ist immer länger als 5sec; Können Sie erklären, wie die Zeit ist? Nach _would_ feuern in weniger als 5sec? – JimB

+0

Ich erwarte nicht, dass es in weniger als 5 Sekunden feuert. Ich erwarte ein Häkchen bei 5 Sekunden, ein weiteres Häkchen bei 10 Sekunden und bei 12 Sekunden sollte 'time.After' ausgelöst werden. Wenn ich jedoch 'time.NewTimer' verwende, um den Timer zu erstellen, wird' time.After' nie ausgelöst, egal wie lange ich warte. – F21

Antwort

3

Ein select blockiert, bis einer seiner Fälle bereit ist, dann führt es diesen Fall aus. In Ihrem Beispiel wird time.After() nie aufgerufen.

func main() { 

    ticker := time.NewTicker(5 * time.Second) 
    for { 
     select { 
     case z := <-ticker.C: 
      fmt.Printf("tick %d\n", z) 

     //This never gets chance to be ready. It'll work if you make it less than 5 seconds. 
     case <-time.After(12 * time.Second): 
      fmt.Println("12 seconds elapsed!") 
     } 
    } 
} 

Sie können es, indem Timer vor for Schleife erklärt bekommen arbeiten.

func main() { 

     ticker := time.NewTicker(5 * time.Second) 
     timer := time.After(12 * time.Second) 
     for { 
       select { 
       case z := <-ticker.C: 
         fmt.Printf("tick %d\n", z) 

       case <-timer: 
         fmt.Println("12 seconds elapsed!") 
       } 
     } 
} 
Verwandte Themen