Maison >développement back-end >Golang >Comment puis-je m'assurer que tous les Goroutines se terminent lorsque j'utilise un canal tamponné comme sémaphore ?
Attente du vide du canal tampon à l'aide d'un groupe d'attente
En programmation simultanée, il est souvent nécessaire de contrôler le nombre de goroutines s'exécutant simultanément. Une approche courante consiste à utiliser un canal tamponné comme sémaphore. Cependant, il est important de noter les limites de cette approche.
Considérons l'exemple suivant :
ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} sem := make(chan struct{}, 2) for _, i := range ints { sem<- struct{}{} go func(id int, sem chan struct{}) { // do something <-sem }(i, sem) }
Ce code utilise un canal tamponné (sem) de taille 2 pour limiter le nombre de concurrents goroutines à 2. Cependant, il y a un problème : le programme peut se terminer avant que les dernières goroutines aient terminé leurs tâches. En effet, le canal tamponné peut devenir vide à tout moment pendant le traitement, même lorsque le programme distribue plus de goroutines.
Pour attendre qu'un canal tamponné se vide, nous ne pouvons pas nous fier au canal lui-même. Au lieu de cela, nous pouvons utiliser un sync.WaitGroup pour suivre le nombre de goroutines en attente :
sem := make(chan struct{}, 2) var wg sync.WaitGroup for _, i := range ints { wg.Add(1) sem<- struct{}{} go func(id int) { defer wg.Done() // do something <-sem }(i) } wg.Wait()
Dans ce code modifié, nous utilisons wg.Add(1) pour incrémenter le groupe d'attente avant de distribuer chaque goroutine. L'instruction defer wg.Done() décrémente ensuite le groupe d'attente lorsque la goroutine termine sa tâche. Enfin, wg.Wait() bloque jusqu'à ce que le groupe d'attente atteigne zéro, garantissant que toutes les goroutines ont fini de s'exécuter. Cette approche nous permet d'attendre que le canal se vide et garantit que le programme ne se termine pas prématurément.
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!