Maison >développement back-end >Golang >Comment puis-je garantir une annulation de contexte en temps opportun dans l'instruction « select » de Go ?

Comment puis-je garantir une annulation de contexte en temps opportun dans l'instruction « select » de Go ?

DDD
DDDoriginal
2024-12-21 21:21:54180parcourir

How Can I Guarantee Timely Context Cancellation in Go's `select` Statement?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn