Maison >développement back-end >Golang >Comment puis-je prioriser l'annulation du contexte dans les instructions « select » de Go ?
Traitement de la priorité dans les instructions Go Select
Dans certains scénarios, il devient crucial de prioriser l'exécution des blocs de cas dans une instruction select. Plus précisément, lorsque vous travaillez avec des contextes qui représentent des événements d'annulation, il est impératif que le signal Terminé soit traité rapidement pour garantir la fin correcte du programme.
Considérez le code suivant :
func sendRegularHeartbeats(ctx context.Context) { for { select { case <-ctx.Done(): return case <-time.After(1 * time.Second): sendHeartbeat() } } }
Cette routine s'exécute dans une goroutine séparée et transmet les battements cardiaques à intervalles réguliers. Cependant, lorsque le contexte est annulé, le code peut occasionnellement encore envoyer un battement de cœur avant que le cas Done ne soit traité.
Le comportement par défaut de l'instruction select ne garantit pas l'ordre d'évaluation du cas, ce qui nécessite d'appliquer explicitement la priorité souhaitée. Une approche imparfaite consiste à vérifier un contexte fermé avant d'effectuer la transmission du rythme cardiaque.
func sendRegularHeartbeats(ctx context.Context) { ticker := time.NewTicker(time.Second) defer ticker.Stop() for { // First select select { case <-ctx.Done(): return default: } // Second select select { case <-ctx.Done(): return case <-ticker.C: // Check if context is done again in case a concurrent Done event arrived select { case <-ctx.Done(): default: } sendHeartbeat() } } }
Bien que cette méthode donne la priorité au signal Terminé, elle introduit une condition de concurrence supplémentaire. Si un événement Done et un événement ticker se produisent simultanément, il est possible que la transmission du rythme cardiaque se produise avant que l'événement Done ne soit géré.
Malheureusement, il n'existe actuellement aucune solution parfaite à ce problème dans Go. Cependant, la solution de contournement fournie offre une amélioration du code d'origine en introduisant une instruction select imbriquée pour minimiser la probabilité de telles conditions de concurrence.
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!