Maison > développement back-end > Golang > Comment arrêter progressivement plusieurs Goroutines dans Go lorsqu'une erreur se produit ?

Comment arrêter progressivement plusieurs Goroutines dans Go lorsqu'une erreur se produit ?

Patricia Arquette
Libérer: 2024-12-07 12:03:16
original
665 Les gens l'ont consulté

How to Gracefully Shutdown Multiple Goroutines in Go When an Error Occurs?

Arrêt progressif de plusieurs goroutines dans Go

Dans les applications Go, la coordination de l'arrêt de plusieurs goroutines est cruciale pour garantir leur terminaison propre et synchrone. Cet article explore le problème de la synchronisation de deux goroutines pour qu'elles reviennent ensemble en cas d'erreur dans l'une ou l'autre des routines.

Considérez l'extrait de code suivant :

func main() {

  go func() {
    ...
    if err != nil {
      return
    }
  }()

  go func() {
    ...
    if err != nil {
      return
    }
  }()


}
Copier après la connexion

Ce scénario nécessite la synchronisation des goroutines de telle sorte que lorsque l'un d'eux rencontre une erreur et revient, l'autre devrait également se terminer. Le défi consiste à y parvenir sans introduire d'écriture sur un canal fermé, ce qui pourrait entraîner une panique.

Une solution très efficace consiste à utiliser le package contextuel de Go pour la communication entre les goroutines. En créant un contexte et en le transmettant à chaque goroutine, vous pouvez fournir un mécanisme pour signaler leur fin. Voici un extrait de code mis à jour illustrant cette approche :

package main

import (
    "context"
    "sync"
)

func main() {

    ctx, cancel := context.WithCancel(context.Background())
    wg := sync.WaitGroup{}
    wg.Add(3)
    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

    go func() {
        defer wg.Done()
        // your operation
        // call cancel when this goroutine ends
        cancel()
    }()
    wg.Wait()
}
Copier après la connexion

Dans ce code, la variable contextuelle ctx sert de canal de communication entre les goroutines. Lorsqu'une erreur se produit dans l'une des goroutines, elle appelle Cancel() sur le contexte, ce qui signale aux autres goroutines de se terminer. Cette solution élégante assure l'arrêt progressif de toutes les goroutines sans risque de panique.

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
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