Maison > développement back-end > Golang > Comment configurer correctement les limites des goroutines ?

Comment configurer correctement les limites des goroutines ?

WBOY
Libérer: 2024-02-13 15:39:08
avant
629 Les gens l'ont consulté

Comment configurer correctement les limites des goroutines ?

l'éditeur php Yuzai vous présentera comment configurer correctement les restrictions goroutine. Dans le langage Go, goroutine est un thread léger qui peut exécuter des tâches simultanément. Cependant, s'il n'est pas limité, un trop grand nombre de goroutines peut entraîner un épuisement des ressources ou un crash du programme. Par conséquent, il est très important de configurer correctement les limites des goroutines. Ensuite, nous explorerons quelques méthodes de configuration courantes pour garantir que votre programme peut fonctionner de manière stable et utiliser pleinement les ressources système.

Contenu de la question

J'ai pour tâche d'exécuter trois fonctions si trois fonctions sont sélectionnées pour fonctionner. Je souhaite limiter le nombre d'horoutines par fonction. Par exemple, chaque goroutine ne peut en exécuter qu’un maximum de 10.

func main() {
    checkMethod1 := true
    checkMethod2 := false
    checkMethod3 := true

    list := []string{"info1", "info2", "info3", "info5"}

    for _, value := range list {
        value := value
        if checkMethod1 {
            go func() {
                //use value
                fmt.Println(value)
            }()
        }
        if checkMethod2 {
            go func() {
                //use value
                fmt.Println(value)
            }()
        }
        if checkMethod3 {
            go func() {
                //use value
                fmt.Println(value)
            }()
        }
    }
    //finish
    fmt.Println("All done")
}
Copier après la connexion

Je sais que vous pouvez limiter le nombre de goroutines à un pool de travailleurs. Cependant, si je crée un pool de travailleurs limité à 10 goroutines, ce nombre est divisé par 3 tâches et j'ai besoin de 10 goroutines par fonction.

Je pourrais créer 3 pools, mais cela ne me semble pas une approche réalisable.

Je souhaite utiliser cette bibliothèque pour créer un pool de travailleurs : https://github.com/sourcegraph/conc

Solution de contournement

Voici une méthode : utilisez un canal tamponné pour chaque option afin de pouvoir limiter les goroutines actives :

m1:=make(chan struct{},10)
m2:=make(chan struct{},10)
m3:=make(chan struct{},10)
wg:=sync.WaitGroup{}

for _, value := range list {
   value := value
   if checkMethod1 {
       m1<-struct{}{}
       wg.Add(1)
       go func() {
           defer func() { 
              <-m1 
              wg.Done()
           }()
           // do work
       }()
   }
   if checkMethod2 {
       m2<-struct{}{}
       wg.Add(1)
       go func() {
           defer func() { 
               <-m2 
               wg.Done()
           }()
           // do work
       }()
   }
   ...

  wg.Wait()
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal