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

Comment configurer correctement les limites des goroutines ?

WBOY
WBOYavant
2024-02-13 15:39:08628parcourir

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")
}

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()
}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer