Lors de la tentative de coordination de l'achèvement de plusieurs goroutines à l'aide de sync.WaitGroup , on peut rencontrer l'erreur "erreur fatale : toutes les goroutines sont endormies - impasse !" Ce message énigmatique peut être déroutant, surtout lorsque le code semble être écrit selon les exemples de la documentation.
La source de cette erreur réside dans la façon dont Go gère les valeurs transmises aux fonctions. Lors du passage direct d'un objet sync.WaitGroup, Go crée une copie de cette valeur, en passant essentiellement un objet différent à chaque goroutine. Cela crée une déconnexion entre le WaitGroup d'origine et les copies sur lesquelles les goroutines opèrent.
La solution à ce problème consiste à passer un pointeur vers le sync.WaitGroup à la place. Ce faisant, toutes les goroutines référenceront le même objet sous-jacent et fonctionneront de manière cohérente sur ses compteurs internes. Le code correct utilisant un pointeur est fourni ci-dessous :
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{} // Use pointer to pass the WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } }
Avec cette modification, les goroutines interagiront correctement avec l'objet WaitGroup, incrémentant son compteur avant de commencer leur travail et le décrémentant une fois terminé. Par conséquent, l'appel WaitGroup.Wait() dans la fonction principale ne se bloquera pas indéfiniment et le programme s'exécutera comme prévu.
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!