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!