Het pakket time biedt twee handige hulpmiddelen: Timer en Ticker.
Belangrijkste verschillen:
Timer "dooft" na activering, deze moet worden gereset (Reset) om deze opnieuw te gebruiken.Ticker genereert gebeurtenissen tot deze expliciet wordt gestopt met de methode Stop().Kenmerken van gebruik:
Stop() aan op Timer/Ticker bij afloop, om te voorkomen dat er hulpbronnen lekken.Stop() voor Timer, moet je mogelijk de kanaal "leegmaken": als de timer is af gegaan voordat Stop() wordt aangeroepen, is het verplicht om uit het kanaal te lezen.Voorbeeld van correct gebruik van Timer:
t := time.NewTimer(2 * time.Second) defer t.Stop() // verplicht! select { case <-t.C: fmt.Println("Tijd is om!") case <-otherDone: if !t.Stop() { <-t.C // leeg het kanaal, indien nodig } }
Kan Timer onmiddellijk opnieuw worden gebruikt na het ontvangen van een waarde uit het kanaal t.C? Wat gebeurt er als je t.Stop() niet aanroept?
Antwoord: De timer mag niet meteen opnieuw worden gereset zonder Stop() aan te roepen en mogelijk uit het kanaal te lezen. Als je t.Stop() niet aanroept, kan er een "dode" goroutine blijven bestaan of een onverwachte trigger optreden in de volgende cyclus (het kanaal is niet geleegd). Correct gebruik: roep Stop() aan, en als Stop() false retourneert — leeg het kanaal door te lezen uit t.C.
Verhaal
Verhaal
Ticker gebruikt voor periodieke productupdates, die niet werden gestopt na het beëindigen van de handler. De handler "hing" zelfs na verwijdering van de gebruiker, en bleef CPU verbruiken.Verhaal
In de tests werd Stop() niet aangeroepen voor de timer — de tests hingen willekeurig omdat het timerkanaal niet werd vrijgegeven, de tweede "ping" van de timer werd verwacht, die nooit kwam.