Maison >développement back-end >Golang >Comment utiliser sync.WaitGroup pour exécuter toutes les goroutines ?
L'éditeur PHP Apple vous présente une méthode pratique pour exécuter toutes les goroutines - sync.WaitGroup. Dans le langage Go, goroutine est un thread léger qui peut effectuer plusieurs tâches en même temps. Cependant, nous devons parfois attendre que toutes les goroutines soient terminées avant de passer à l'étape suivante. À l’heure actuelle, sync.WaitGroup est utile. Il fournit un moyen simple et efficace d'attendre la fin de toutes les goroutines, garantissant ainsi le bon ordre d'exécution du programme. Ensuite, nous présenterons en détail comment utiliser sync.WaitGroup pour implémenter cette fonction.
Actuellement, je pousse toutes les valeurs vers un canal, je les lis et je calcule leur carré.
Je veux éviter d'utiliser time.sleep(2000 * time.millisecond)
car il bloque l'exécution pendant 2 secondes, je veux plutôt que chaque goroutine soit traitée et attende son exécution, puis quitte le programme. Je viens de quitter Golang, alors je pose maintenant cette question fondamentale :(. Quelqu'un peut-il m'aider à résoudre ce problème ?
package main import ( "fmt" "sync" "time" ) func doSquare(num int) int { return num * num } var wg sync.WaitGroup func main() { wg.Add(1) st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) go func() { for i := range st { ch <- i } }() go func() { for { select { case x := <-ch: fmt.Println(doSquare(x)) // return case <-quit: wg.Done() default: // fmt.Println("---") // do something } } }() quit <- true wg.Wait() time.Sleep(2000 * time.Millisecond) }
Déplacez-vous simplement quit jusqu'à la fin de la première goroutine
func main() { wg.add(1) st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) go func() { for i := range st { ch <- i } quit <- true }() go func() { for { select { case x := <-ch: fmt.println(dosquare(x)) // return case <-quit: wg.done() return default: // fmt.println("---") // do something } } }() wg.wait() }
C'est close(ch)
une autre façon de dire qu'il n'y a plus de données
func main() { st := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} quit := make(chan bool) ch := make(chan int) // improve concurrency by `ch := make(chan int, 100)` go func() { for i := range st { ch <- i } close(ch) }() go func() { for x := range ch { fmt.Println(doSquare(x)) } quit <- true }() <-quit }
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!