L'éditeur PHP Youzi présentera une méthode d'écriture de chan en goroutine sync.WaitGroup. En programmation simultanée, sync.WaitGroup est un mécanisme de synchronisation très utile qui peut attendre la fin de l'exécution d'un groupe de goroutines. Cependant, nous devons parfois écrire les résultats sur un chan une fois que la goroutine a terminé son exécution pour être consommés par d'autres goroutines. Cet article présentera en détail comment implémenter cette fonction dans la goroutine sync.WaitGroup, jetons un coup d'oeil !
Je reçois une liste d'éléments provenant d'un point de terminaison d'API. Ensuite, pour chaque projet, je fais une autre requête API pour obtenir des données sur le projet individuel.
Je ne peux pas faire une deuxième requête API à chaque projet en même temps car mon jeton API est limité en débit et si je fais trop de requêtes en même temps, je suis limité.
Cependant, les données de réponse initiales de l'API peuvent être divisées en plusieurs pages, ce qui me permet de traiter des pages de données simultanément.
Après quelques recherches, le code ci-dessous fait exactement ce que je veux :
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } go func() { wg.Wait() close(results) }() for result := range results { fmt.Println(result) } }
Je veux comprendre pourquoi ça marche :
go func() { wg.Wait() close(results) }()
Ma première tentative a échoué - je pensais pouvoir lire le résultat pendant wg.Wait()
之后遍历通道,并且我会在结果写入 results
la canalisation.
func main() { // pretend paginated results from initial API request page1 := []int{1, 2, 3} page2 := []int{4, 5, 6} page3 := []int{7, 8, 9} pages := [][]int{page1, page2, page3} results := make(chan string) var wg sync.WaitGroup for i := range pages { wg.Add(1) go func(i int) { defer wg.Done() for j := range pages[i] { // simulate making additional API request and building the report time.Sleep(500 * time.Millisecond) result := fmt.Sprintf("Finished creating report for %d", pages[i][j]) results <- result } }(i) } // does not work wg.Wait() close(results) for result := range results { fmt.Println(result) } }
Lors de votre premier essai :
Au deuxième essai :
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!