Maison > développement back-end > Golang > Comment tuer gracieusement plusieurs Goroutines simultanément dans Go ?

Comment tuer gracieusement plusieurs Goroutines simultanément dans Go ?

Barbara Streisand
Libérer: 2024-12-05 00:48:11
original
688 Les gens l'ont consulté

How to Gracefully Kill Multiple Goroutines Simultaneously in Go?

Comment tuer plusieurs goroutines à la fois dans Go

Dans Go, vous pouvez rencontrer des scénarios dans lesquels vous devez mettre fin à plusieurs goroutines simultanément. Ceci est particulièrement utile lorsque l'achèvement d'une goroutine doit déclencher la fin des autres.

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

Dans ce cas, vous voulez vous assurer que lorsque l'une des goroutines revient, l’autre devrait également sortir. Une approche courante pour y parvenir consiste à utiliser des canaux pour la signalisation. Cependant, cela peut conduire à une panique d'écriture sur un canal fermé.

Une solution fiable à ce problème consiste à exploiter le mécanisme contextuel de Go. Le contexte vous permet d'établir une communication entre les routines et de signaler lorsqu'une opération est terminée ou annulée. Voici un exemple :

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 cet exemple, nous créons un contexte qui peut être transmis aux goroutines pour vérifier les signaux de terminaison. Lorsque la troisième goroutine termine son opération, elle appelle Cancel(), qui envoie un signal aux deux goroutines en attente de son achèvement. En conséquence, toutes les goroutines se terminent gracieusement.

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