Maison > Article > développement back-end > Comment limiter l’exécution simultanée de Goroutine dans Go ?
Limiter l'exécution simultanée de goroutines
Considérez un scénario dans lequel vous avez une liste d'URL à traiter et souhaitez limiter le nombre de goroutines simultanées en cours d'exécution . Par exemple, si vous avez 30 URL, vous souhaiterez peut-être que seulement 10 goroutines fonctionnent en parallèle.
Le code fourni tente d'utiliser un canal tampon de taille parallèle pour limiter le nombre de goroutines en cours d'exécution. . Cependant, cette approche ne semble pas bloquer après le traitement de toutes les URL. Un moyen plus efficace d'atteindre cette limitation de concurrence consiste à créer un nombre spécifié de goroutines de travail et à leur fournir des URL via un canal dédié.
Voici une version améliorée du code :
<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed") flag.Parse() urls := flag.Args() // Create a channel to hold URLs that workers will consume workerURLChan := make(chan string) // Start a goroutine to feed URLs to the workers go func() { for _, u := range flag.Args() { workerURLChan <- u } // Once all URLs have been distributed, close the channel, which will cause workers to exit close(workerURLChan) }() var wg sync.WaitGroup client := rest.Client{} results := make(chan string) // Start the specified number of worker goroutines for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() // Workers repeatedly fetch URLs from the channel until it is closed for url := range workerURLChan { worker(url, client, results) } }() } // Close the results channel when all workers have completed, which will allow the main goroutine to exit go func() { wg.Wait() close(results) }() // Receive and print results from the worker goroutines for res := range results { fmt.Println(res) }</code>
Dans ce code mis à jour, nous créons une goroutine de travail pour chaque exécution simultanée autorisée, et ces travailleurs récupèrent les URL du canal dédié. Une fois que toutes les URL ont été distribuées, le workerURLChan est fermé, ce qui déclenche la fermeture des Workers lorsque leur URL actuelle est terminée. Ce mécanisme limite efficacement le nombre de goroutines simultanées en cours d'exécution.
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!