Comment attendre gracieusement la fin des routines Go
Lors du développement avec Go, il est crucial de s'assurer que les routines se terminent avant de quitter le programme. L'utilisation d'un canal booléen, comme illustré dans le lien Playground fourni, peut efficacement y parvenir.
Comprendre le fonctionnement du canal
L'opération de blocage <- done suspend l'exécution du programme jusqu'à ce qu'une valeur vraie ou fausse soit envoyée via le canal. Par conséquent, dans le code donné, la fonction main() attend que done reçoive le booléen true de la routine do_stuff.
Gestion des scénarios de blocage
Décommentation de la dernière ligne, <-done entraîne un blocage car le canal est vide. Sans qu'une autre routine ne lui envoie des valeurs, la fonction main() reste bloquée indéfiniment. Pour éviter cette situation, il est essentiel de s'assurer qu'une routine envoie toujours une valeur via le canal lorsque prévu, signalant l'achèvement à la fonction d'attente.
Approches alternatives
Alors la méthode du canal booléen est une solution simple, le package de synchronisation fournit des options supplémentaires pour coordonner les opérations simultanées. Considérez le code suivant :
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { longOp() wg.Done() }() } // Waits until all routines complete (wg.Done called 10 times) wg.Wait() } func longOp() { time.Sleep(time.Second * 2) fmt.Println("Long operation completed") }
Dans ce scénario, sync.WaitGroup est utilisé pour suivre et synchroniser les routines simultanées, en garantissant que main() attend la fin de toutes les routines avant de poursuivre l'exécution.
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!