Heim  >  Artikel  >  Backend-Entwicklung  >  Wie konfiguriere ich Goroutine-Limits richtig?

Wie konfiguriere ich Goroutine-Limits richtig?

WBOY
WBOYnach vorne
2024-02-13 15:39:08618Durchsuche

Wie konfiguriere ich Goroutine-Limits richtig?

php-Editor Yuzai zeigt Ihnen, wie Sie Goroutine-Einschränkungen richtig konfigurieren. In der Go-Sprache ist Goroutine ein leichter Thread, der Aufgaben gleichzeitig ausführen kann. Wenn sie jedoch nicht eingeschränkt werden, können zu viele Goroutinen zu einer Ressourcenerschöpfung oder einem Programmabsturz führen. Daher ist es sehr wichtig, die Goroutine-Grenzwerte richtig zu konfigurieren. Als Nächstes werden wir einige gängige Konfigurationsmethoden untersuchen, um sicherzustellen, dass Ihr Programm stabil läuft und die Systemressourcen vollständig nutzt.

Frageninhalt

Ich habe die Aufgabe, drei Funktionen auszuführen, wenn drei Funktionen zur Ausführung ausgewählt sind. Ich möchte die Anzahl der Horoutinen pro Funktion begrenzen. Beispielsweise kann jede Goroutine nur maximal 10 ausführen.

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

Ich weiß, dass Sie die Anzahl der Goroutinen auf einen Worker-Pool beschränken können. Wenn ich jedoch einen Worker-Pool erstelle, der auf 10 Goroutinen begrenzt ist, wird diese Zahl durch 3 Aufgaben geteilt und ich benötige 10 Goroutinen pro Funktion.

Ich könnte 3 Pools erstellen, aber das scheint mir kein praktikabler Ansatz zu sein.

Ich möchte diese Bibliothek verwenden, um einen Worker-Pool zu erstellen: https://github.com/sourcegraph/conc

Workaround

Hier ist eine Methode: Verwenden Sie für jede Option einen gepufferten Kanal, damit Sie die aktiven Goroutinen begrenzen können :

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

Das obige ist der detaillierte Inhalt vonWie konfiguriere ich Goroutine-Limits richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen