ProgrammatieGo ontwikkelaar

Wat moet je weten over het werken met time.Timer en time.Ticker in Go? Wat zijn de belangrijkste verschillen, kenmerken van correct gebruik en veelvoorkomende fouten bij het stoppen/resetten?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

Het pakket time biedt twee handige hulpmiddelen: Timer en Ticker.

  • Timer wordt gebruikt voor een eenmalige vertraging (gaat één keer af na een bepaalde tijd).
  • Ticker — voor regelmatige periodieke gebeurtenissen (interval).

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:

  • Roep altijd Stop() aan op Timer/Ticker bij afloop, om te voorkomen dat er hulpbronnen lekken.
  • Na het aanroepen van 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 } }

Valentijns vraag

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.

Voorbeelden van echte fouten door gebrek aan kennis van de nuances van het onderwerp


Verhaal

In de notificatieservice van een startup werden timers gebruikt om leverpogingen te resetten. Na activering werden ze onmiddellijk teruggezet zonder te stoppen — resultaat: het aantal goroutines nam toe, het proces "lekte", en het systeem viel om door gebrek aan geheugen.

Verhaal

In een groot e-commerceproject werd een 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.