Maison >développement back-end >Golang >Où devriez-vous placer « wg.Add() » pour un comptage précis dans « sync.WaitGroup » de Go ?

Où devriez-vous placer « wg.Add() » pour un comptage précis dans « sync.WaitGroup » de Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-28 07:15:30196parcourir

  Where Should You Place `wg.Add()` for Accurate Counting in Go's `sync.WaitGroup`?

Placement de groupe d'attente pour un comptage précis

Dans la programmation simultanée, le type sync.WaitGroup sert de primitive de synchronisation pour coordonner les goroutines. Il suit le nombre de tâches à accomplir avant qu'un appel bloquant à wg.Wait() puisse continuer.

Placement correct de wg.Add()

À Pour garantir un comptage précis des tâches, il est crucial d'appeler wg.Add(1) avant de lancer une goroutine qui appelle ensuite wg.Done(). Ce placement garantit que la goroutine principale se bloquera à wg.Wait() jusqu'à ce que toutes les goroutines lancées soient terminées.

Conséquences de placement alternatives

Comme démontré dans l'exemple de code, placer wg.Add(1) dans la goroutine peut conduire à l'achèvement prématuré de wg.Wait(). Cela se produit parce que, au sein de la même goroutine, wg.Done() est appelé immédiatement après wg.Add(1), provoquant la reprise de l'exécution de la goroutine principale avant que toutes les tâches ne soient terminées.

Achèvement déterministe

Lorsque wg.Add() est correctement placé avant le lancement de la goroutine, la goroutine principale ne peut atteindre wg.Wait() qu'après la boucle for. Cela garantit que wg.Add() est appelé exactement 100 fois, et donc wg.Wait() se bloque jusqu'à ce que wg.Done() soit appelé 100 fois.

Alternatives

Comme alternative, si le nombre d'itérations de la boucle est connu à l'avance, wg.Add(100) peut être appelé avant la boucle. Cependant, cette approche doit être utilisée avec prudence, car elle ne suppose aucun saut conditionnel dans la boucle.

Bonnes pratiques

Pour une utilisation cohérente et fiable de sync.WaitGroup, suivez ces directives :

  1. Appelez wg.Add() dans la goroutine principale avant de démarrer une nouvelle goroutine.
  2. Appelez wg.Done() de manière différée dans la goroutine pour garantir l'achèvement même dans cas de panique.
  3. Lors du partage d'un WaitGroup entre fonctions, passez un pointeur vers le WaitGroup pour éviter de faire des copies.

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