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