Maison > Article > développement back-end > Comment résoudre le problème de minuterie simultanée en langage Go ?
Les problèmes de minuterie de concurrence dans le langage Go font référence à certains problèmes liés à la concurrence qui peuvent survenir lorsque plusieurs goroutines doivent utiliser des minuteries en même temps. Afin de résoudre ces problèmes, le langage Go propose quelques mécanismes et techniques. Cet article présentera ces solutions en détail et donnera des exemples de code.
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(1 * time.Second) go func() { for { <-ticker.C fmt.Println("Tick") } }() time.Sleep(5 * time.Second) ticker.Stop() fmt.Println("Ticker stopped") }
Dans le code ci-dessus, nous créons un ticker avec un intervalle de 1 seconde, puis recevons en continu les événements du canal ticker.C du ticker dans une goroutine, et nous produisons "Tick" . Attendez 5 secondes dans la goroutine principale, puis arrêtez le ticker. L'exécution de ce code produira les résultats suivants :
Tick Tick Tick Tick Tick Ticker stopped
package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) go func() { for { select { case <-ctx.Done(): return case <-time.After(1 * time.Second): fmt.Println("Tick") } } }() time.Sleep(5 * time.Second) cancel() fmt.Println("Timer cancelled") }
Dans le code ci-dessus, nous créons d'abord un objet contextuel ctx avec une fonction d'annulation et le transmettons à la goroutine. Dans la goroutine, nous utilisons l'instruction select pour écouter deux canaux : ctx.Done() et time.After(). Lorsque le canal ctx.Done() a une valeur, cela signifie que le contexte a été annulé et que l'on peut quitter la goroutine. Lorsque le canal time.After() a une valeur, cela signifie que le temps est écoulé et nous imprimons "Tick". Dans la goroutine principale, nous attendons 5 secondes puis appelons la fonction Cancel() pour annuler le timer. L'exécution de ce code produira les résultats suivants :
Tick Tick Tick Tick Tick Timer cancelled
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() time.Sleep(2 * time.Second) fmt.Println("Timer 1 finished") }() go func() { defer wg.Done() time.Sleep(3 * time.Second) fmt.Println("Timer 2 finished") }() wg.Wait() fmt.Println("All timers finished") }
Dans le code ci-dessus, nous utilisons sync.WaitGroup pour attendre la fin de deux minuteries. Dans la goroutine de chaque timer, nous utilisons le mot-clé defer pour appeler wg.Done() à la fin de la fonction, indiquant que la goroutine en cours est terminée. Dans la goroutine principale, nous appelons wg.Wait() pour attendre l'expiration de tous les timers. L'exécution de ce code produira les résultats suivants :
Timer 1 finished Timer 2 finished All timers finished
Résumé :
Cet article présente trois solutions au problème de minuterie simultanée dans le langage Go, à savoir en utilisant time.Ticker, context.Context et sync.WaitGroup. À travers des exemples de code, nous expliquons en détail l'utilisation et les précautions pour chaque scénario. Ces solutions peuvent aider les développeurs à mieux gérer les problèmes liés aux minuteries simultanées et à améliorer la fiabilité et les performances du code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!