Maison >développement back-end >Golang >Comment éviter « l'erreur fatale : tous les goroutines sont endormis - impasse ! » avec sync.WaitGroup ?
Comprendre "erreur fatale : toutes les goroutines sont endormies - impasse !" avec sync.WaitGroup
Lorsque vous essayez d'utiliser le package sync.WaitGroup pour gérer des goroutines simultanées, il est crucial d'éviter la redoutable "erreur fatale : toutes les goroutines sont endormies - impasse !". Cette erreur résulte d'une utilisation incorrecte de WaitGroup, en particulier lors de la transmission de la valeur par copie plutôt que par référence.
La cause du blocage
Le problème vient du fait que lorsque vous transmettez l'objet WaitGroup réel à la fonction doWork, Go fait une copie de la valeur. Cela signifie que le WaitGroup d'origine aura incrémenté le compteur de dix appels Add() sans aucun appel Done() correspondant. En revanche, chaque copie du WaitGroup transmise aux goroutines n'aura qu'un seul appel Done() et le nombre d'appels Add() qui étaient présents lorsque le WaitGroup a été copié.
La solution : passer un Pointeur vers WaitGroup
Pour résoudre ce blocage, il est essentiel de passer un pointeur vers le WaitGroup plutôt que vers l'objet WaitGroup lui-même. Cela garantit que toutes les goroutines font référence au même WaitGroup, et lorsqu'elles appellent Done(), le compteur décrémentant est appliqué au bon WaitGroup.
Code modifié
Ce qui suit le code modifié démontre l'utilisation correcte d'un pointeur vers WaitGroup :
import "sync" func doWork(wg *sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } wg.Wait() }
En adoptant cette approche, vous pouvez gérer en toute confiance goroutines avec WaitGroup, évitant les pièges des blocages et garantissant une exécution simultanée efficace.
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!