Pour utiliser sync.WaitGroup
pour attendre que plusieurs Goroutines se terminent, vous suivez ces étapes:
Initialisez un groupe d'attente : Tout d'abord, vous devez créer une instance de sync.WaitGroup
. Cela se fait généralement en utilisant une déclaration simple:
<code class="go">var wg sync.WaitGroup</code>
Ajouter au groupe d'attente : Avant de démarrer vos Goroutines, vous incrémentez le compteur de groupe d'attente pour chaque goroutine que vous avez l'intention de commencer. Cela indique au groupe d'attente combien de goroutines il a besoin d'attendre:
<code class="go">wg.Add(1)</code>
Démarrer les goroutines : Dans la fonction Goroutine, vous utilisez une instruction de différence pour décrémenter le compteur à la fin du goroutine. Cela garantit que le compteur est décrémenté même si le goroutine sort prématurément en raison d'une panique:
<code class="go">go func() { defer wg.Done() // Goroutine work here }()</code>
Attendez l'achèvement : après avoir démarré tous vos Goroutines, vous appelez Wait()
sur le groupe d'attente. Cela bloque l'exécution du goroutine principal jusqu'à ce que le compteur atteigne zéro, ce qui signifie que tous les goroutines suivis ont terminé:
<code class="go">wg.Wait()</code>
Voici un exemple complet:
<code class="go">package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup for i := 1; i </code>
Lorsque vous utilisez sync.WaitGroup
, il y a plusieurs pièges courants à éviter:
Add
avant de démarrer les goroutines : si vous démarrez un Goroutine avant d'appeler Add
, le compteur de groupe d'attente ne reflètera pas le bon nombre de Goroutines à attendre, conduisant à une terminaison prématurée de l'appel Wait()
.Add
et Done
: assurez-vous que chaque appel Add(1)
a un appel Done()
correspondant. Si ceux-ci sont décalés, le programme accrochera indéfiniment ou Wait()
reviendra prématurément.Add
et Done
: Veillez à ne pas appeler Add
ou Done
simultanément avec Wait
. Une erreur courante consiste à appeler Add
après avoir démarré un goroutine qui utilise Done
, ce qui peut conduire à une condition de course.defer
pour Done
: c'est une bonne pratique d'utiliser defer wg.Done()
au début de votre goroutine. Cela garantit que Done
est appelé même si le goroutine panique. sync.WaitGroup
contribue à gérer le cycle de vie des opérations simultanées en fournissant un mécanisme simple pour synchroniser l'achèvement de plusieurs goroutines. Voici comment cela aide:
sync.WaitGroup
garantit que le goroutine principal attend tous les goroutins engendrés pour terminer leurs tâches avant de continuer. Ceci est crucial pour maintenir le bon ordre d'opérations dans les programmes simultanés.sync.WaitGroup
aide à gérer le cycle de vie de ces Goroutines. Il permet au programme de savoir quand toutes les opérations sont terminées, ce qui est essentiel pour le nettoyage, la libération des ressources ou le traitement ultérieur.sync.WaitGroup
lui-même ne gère pas les erreurs, il facilite une approche structurée de la concurrence où les erreurs de goroutines individuelles peuvent être collectées et traitées une fois que tous les goroutines ont terminé.sync.WaitGroup
évolue bien avec le nombre de goroutines. Que vous ayez deux ou deux mille goroutines, le mécanisme reste le même, ce qui le rend adapté aux applications allant des petits scripts aux systèmes à grande échelle. Suivre les meilleures pratiques lors de l'initialisation et de l'utilisation sync.WaitGroup
dans les programmes GO peut assurer une gestion de concurrence efficace et correcte. Voici les pratiques clés:
Initialisez WaitGroup localement : initialisez sync.WaitGroup
dans la fonction ou la portée où il est nécessaire. Cela réduit les chances de réutilisation accidentelle et de conditions de course potentielles:
<code class="go">func someFunction() { var wg sync.WaitGroup // Use wg within this function }</code>
Utilisez Add
avant de démarrer les goroutines : appelez toujours Add
avant de démarrer le goroutine. Cela évite les conditions de course où le goroutine pourrait finir avant Add
appel:
<code class="go">wg.Add(1) go func() { defer wg.Done() // Goroutine work }()</code>
Déférer les appels Done
: utilisez defer wg.Done()
au début de votre goroutine pour vous assurer qu'elle s'appelle même si le goroutine panique:
<code class="go">go func() { defer wg.Done() // Goroutine work }()</code>
sync.WaitGroup
a terminé son cycle de vie (c'est-à-dire après les retours Wait
), ne le réutilisez pas. Créez un nouveau sync.WaitGroup
pour de nouveaux ensembles de Goroutines. Gérer les erreurs : collecter et gérer les erreurs de Goroutines après les renvoyés Wait
. Vous pouvez utiliser des canaux ou d'autres mécanismes de synchronisation pour communiquer des erreurs au goroutine principal:
<code class="go">errors := make(chan error, len(workers)) for _, worker := range workers { wg.Add(1) go func(w Worker) { defer wg.Done() if err := w.DoWork(); err != nil { errors </code>
En suivant ces meilleures pratiques, vous pouvez utiliser efficacement sync.WaitGroup
pour gérer les opérations simultanées en Go, garantissant que vos programmes sont robustes et fiables.
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!