Lorsque vous travaillez avec des routines Go simultanées, la gestion de la synchronisation est cruciale pour éviter les blocages. Un de ces scénarios se produit lorsque vous essayez de coordonner plusieurs goroutines et d'attendre leur achèvement à l'aide de sync.WaitGroup. Cependant, parfois, vous pouvez rencontrer l'erreur : "erreur fatale : toutes les goroutines sont endormies - blocage !".
Cette erreur provient d'une utilisation incorrecte de sync.WaitGroup. Dans l'extrait de code fourni :
import "sync" func doWork(wg sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } wg.Wait() }
Le problème réside dans la transmission de l'objet sync.WaitGroup directement à la fonction doWork. Lors du passage d'une valeur par valeur, une copie de l'objet est créée, ce qui entraîne un comportement inattendu.
Le correctif implique de passer un pointeur vers le sync.WaitGroup à la place :
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() }
Par en passant un pointeur, chaque goroutine fera référence au même objet WaitGroup, garantissant que Done() est appelé sur l'instance prévue. Cela résout le problème de blocage et permet au programme de s'exécuter sans erreur.
N'oubliez pas que lorsque vous utilisez sync.WaitGroup pour synchroniser des goroutines, transmettez toujours un pointeur vers l'objet pour garantir un comportement cohérent et éviter les blocages potentiels.
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!