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
Barbara Streisandoriginal
2024-12-05 00:48:11690parcourir

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
    }
  }()

}

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()
}

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!

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