Maison > développement back-end > Golang > Comment limiter l'exécution simultanée de Goroutine dans Go ?

Comment limiter l'exécution simultanée de Goroutine dans Go ?

Linda Hamilton
Libérer: 2024-11-02 05:27:02
original
1063 Les gens l'ont consulté

How to Limit Concurrent Goroutine Execution in 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal