Maison > développement back-end > Golang > Comment terminer gracieusement une Goroutine en Go : signaler un arrêt ?

Comment terminer gracieusement une Goroutine en Go : signaler un arrêt ?

DDD
Libérer: 2024-11-04 05:30:29
original
258 Les gens l'ont consulté

How to Gracefully Terminate a Goroutine in Go: Signaling a Stop?

Comprendre la terminaison de Goroutine : signaler un arrêt

Les goroutines fournissent un mécanisme puissant pour l'exécution simultanée dans les programmes Go. Cependant, il devient crucial de gérer efficacement leur cycle de vie. Dans ce contexte, comprendre comment signaler à une goroutine d'arrêter de fonctionner est essentiel.

Dans l'extrait de code fourni, l'objectif est d'arrêter une goroutine basée sur un indicateur 'trop tard'. Cependant, cette approche est problématique car la lecture à partir d'un canal nul bloquera la goroutine.

Pour relever ce défi, une approche recommandée consiste à utiliser un canal supplémentaire spécifiquement pour la signalisation. Cela permet à la goroutine de surveiller et de répondre au signal d'arrêt de manière proactive. Considérez le code modifié suivant :

<code class="go">func main() {
    tooLate := make(chan struct{})
    proCh := make(chan string)

    go func() {
        for {
            fmt.Println("Working")
            time.Sleep(1 * time.Second)
            select {
            case <-tooLate:
                fmt.Println("Stopped")
                return
            case proCh <- "processed": // Send if not timed out
            default: // Default ensures non-blocking behavior
            }
            fmt.Println("Done here")
        }
    }()

    select {
    case proc := <-proCh:
        fmt.Println(proc)
    case <-time.After(1 * time.Second):
        fmt.Println("Too late")
        close(tooLate)
    }

    time.Sleep(4 * time.Second)
    fmt.Println("Finish")
}</code>
Copier après la connexion

Dans cette implémentation mise à jour, « tooLate » est un canal de type « struct{} », qui est essentiellement une structure vide. La goroutine vérifie en permanence les données sur ce canal dans une instruction « select ». Lorsqu'une valeur est reçue (signalant qu'il est « trop tard »), la goroutine imprime « Stopped » et revient, se terminant effectivement.

De plus, dans l'instruction « select » dans le cas « proCh », en ajoutant une branche « par défaut » garantit que la goroutine ne peut pas bloquer. Ceci est crucial car le minuteur peut expirer une fois que la goroutine a déjà traité les données et les a envoyées sur le « proCh ».

Cette approche améliorée offre une méthode propre et fiable pour signaler à une goroutine de s'arrêter tout en conservant les avantages. d'exécution simultanée.

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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal