Le package time fournit deux outils utiles : Timer et Ticker.
Différences clés :
Timer après son déclenchement "s'éteint", il doit être réinitialisé (Reset) pour être utilisé à nouveau.Ticker génère des événements tant qu'il n'est pas explicitement arrêté par la méthode Stop().Particularités d'utilisation :
Stop() sur Timer/Ticker lors de la fin de l'utilisation, pour éviter les fuites de ressources.Stop() sur Timer, il peut être nécessaire de « vidanger » le canal : si le minuteur a été déclenché avant Stop(), la lecture du canal est obligatoire.Exemple d'utilisation correcte de Timer :
t := time.NewTimer(2 * time.Second) defer t.Stop() // obligatoire! select { case <-t.C: fmt.Println("Le temps est écoulé !") case <-otherDone: if !t.Stop() { <-t.C // vidons le canal si nécessaire } }
Peut-on réutiliser immédiatement Timer après avoir reçu une valeur du canal t.C ? Que se passe-t-il si on ne fait pas t.Stop() ?
Réponse : Le minuteur ne doit pas être réinitialisé immédiatement sans un appel à Stop() et la possible lecture du canal. Si on ne fait pas t.Stop(), il pourrait rester une goroutine "morte" ou un déclencheur inattendu au cycle suivant (le canal n'est pas vidé). Utilisation correcte : appelez Stop(), et si Stop() retourne false — assurez-vous de vider le canal en lisant depuis t.C.
Histoire
Histoire
Ticker était utilisé, qui n'était pas arrêté lors de la fin du gestionnaire. Le gestionnaire "pendait" même après la suppression de l'utilisateur, continuant à consommer du CPU.Histoire
Dans les tests, Stop() n'était pas appelé pour le minuteur — les tests échouaient de manière aléatoire parce que le canal du minuteur n'était pas libéré, attendant un deuxième "ping" du minuteur, qui n'arrivait jamais.