Maison >développement back-end >Golang >Comment terminer gracieusement une Goroutine en cours d'exécution dans Go ?

Comment terminer gracieusement une Goroutine en cours d'exécution dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 01:03:021034parcourir

How to Gracefully Terminate a Running Goroutine in Go?

Signalisation des goroutines pour qu'elles se terminent

Dans Go, la gestion de la terminaison des goroutines peut être cruciale pour garantir un arrêt progressif des applications ou gérer l'allocation des ressources. Cet article explore une technique pour signaler à une goroutine en cours d'exécution d'arrêter son exécution.

L'exemple fourni dans l'enquête démontre une goroutine qui fait des boucles infinies, simulant un traitement continu. L'objectif est de mettre fin à cette goroutine si elle dépasse un délai d'attente spécifié.

Une première approche consiste à utiliser deux canaux : un pour la communication et l'autre pour la signalisation de la fin. Cependant, la lecture à partir du canal de signalisation bloquerait la goroutine, ce qui irait à l'encontre de son objectif.

Utiliser un canal d'arrêt supplémentaire

Une solution efficace consiste à introduire un canal d'arrêt supplémentaire , tropLate, de type chan struct{}. À l'intérieur de la goroutine, une instruction select est utilisée pour surveiller à la fois le canal de communication et le canal d'arrêt. Si le canal tropLate reçoit une valeur, la goroutine revient gracieusement, mettant fin à sa boucle de traitement.

Voici l'extrait de code modifié :

<code class="go">func main() {
    // tooLate channel to signal goroutine to stop
    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": // Avoid blocking
            default: // Handle potential blocking
            }
            fmt.Println("done here")
        }
    }()

    // ...

    // Signal termination
    fmt.Println("too late")
    close(tooLate)

    // ...
}</code>

Dans cette solution, le canal proCh continue d'être utilisé pour la communication, tandis que le canal TooLate sert de signal de terminaison. Lorsque le canal TooLate est fermé, la goroutine le détecte et quitte sa boucle.

Autres considérations

En plus d'utiliser un canal supplémentaire, il existe des approches alternatives pour signaler les goroutines, comme l'utilisation du type sync.Cond intégré pour un contrôle plus précis de la synchronisation des goroutines. Le choix de la technique dépend des exigences spécifiques de votre application.

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