Maison > développement back-end > Golang > Comment puis-je prioriser l'annulation du contexte dans les instructions « select » de Go ?

Comment puis-je prioriser l'annulation du contexte dans les instructions « select » de Go ?

Patricia Arquette
Libérer: 2024-12-10 09:59:16
original
209 Les gens l'ont consulté

How Can I Prioritize Context Cancellation in Go's `select` Statements?

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()
        }
    }
}
Copier après la connexion

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()
        }
    }
}
Copier après la connexion

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!

Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal