Priorité à la sélection des cas dans Go
Dans l'instruction select de Go, l'ordre d'évaluation des cas n'est pas déterministe, ce qui entraîne des incohérences potentielles lors de la gestion du contexte événements d’annulation en temps opportun. Un scénario courant implique une routine d’arrière-plan qui envoie des battements de cœur réguliers, qui devraient s’arrêter immédiatement lorsque le contexte est annulé. Cependant, il est possible d'observer l'envoi de battements de cœur même après l'annulation du contexte en raison de l'ordre de sélection imprévisible.
Pour garantir l'arrêt immédiat des battements de cœur lors de l'annulation du contexte, une approche plus robuste est requise. Au lieu de s’appuyer sur l’ordre d’évaluation des cas, la méthode préférée consiste à prioriser explicitement le cas d’annulation de contexte. Ceci peut être réalisé en utilisant une instruction select imbriquée avec la priorité souhaitée : le cas d'annulation de contexte doit être placé dans une instruction select externe, suivie d'une deuxième instruction select gérant la fonctionnalité de battement de coeur.
Considérez le code modifié suivant :
func sendRegularHeartbeats(ctx context.Context) { ticker := time.NewTicker(time.Second) defer ticker.Stop() for { //outer select, giving priority to context cancellation select { case <-ctx.Done(): return default: } //inner select for heartbeat functionality select { case <-ctx.Done(): return case <-ticker.C: sendHeartbeat() } } }
En imbriquant le cas de gestion du battement de cœur dans une instruction de sélection externe, nous priorisons efficacement le cas d'annulation de contexte, garantissant son exécution immédiate lorsque le contexte est annulé. Cela élimine la possibilité que des battements de cœur soient envoyés après l'annulation du contexte, garantissant ainsi le comportement souhaité.
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!