Maison  >  Article  >  développement back-end  >  Comment limiter efficacement les routines Go simultanées ?

Comment limiter efficacement les routines Go simultanées ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-02 05:25:02779parcourir

How to Effectively Limit Concurrent Go Routines?

Limiter les routines Go simultanées

Dans votre code, vous tentez de limiter le nombre de goroutines simultanées. Cependant, la mise en œuvre actuelle ne fonctionne pas comme prévu. Voici une approche alternative :

Solution :

Au lieu de créer une goroutine pour chaque URL, créez un nombre fixe de travailleurs qui traitent les URL d'un canal partagé. Voici le code modifié :

<code class="go">parallel := flag.Int("parallel", 10, "max parallel requests allowed")
flag.Parse()

// Workers get URLs from this channel
urls := make(chan string) 

// Feed the workers with URLs
go func() {
    for _, u := range flag.Args() {
        urls <- u
    }
    // Workers will exit from range loop when channel is closed
    close(urls)
}()

var wg sync.WaitGroup
client := rest.Client{}

results := make(chan string)

// Start the specified number of workers.
for i := 0; i < *parallel; i++ {
    wg.Add(1)
    go func() {
        defer wg.Done()
        for url := range urls {
            worker(url, client, results)
        }
    }()
}

// When workers are done, close results so that main will exit.
go func() {
    wg.Wait()
    close(results)
}()

for res := range results {
    fmt.Println(res)
}</code>

Explication :

  • Une URL de canal mise en mémoire tampon est créée, qui fournira des URL aux travailleurs.
  • Une goroutine distincte est chargée d'alimenter le canal d'URL avec les URL fournies.
  • Le nombre souhaité de travailleurs est créé. Chaque travailleur extrait les URL du canal URL et les traite en série.
  • Lorsque tous les travailleurs ont terminé le traitement, une goroutine ferme le canal de résultats pour signaler que tous les résultats ont été récupérés.

Ceci Cette approche garantit qu'un maximum de goroutines parallèles sont actives à un moment donné, limitant ainsi la concurrence comme souhaité.

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!

Déclaration:
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