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

Wie konfiguriere ich Goroutine-Limits richtig?

WBOY
Freigeben: 2024-02-13 15:39:08
nach vorne
630 Leute haben es durchsucht

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")
}
Nach dem Login kopieren

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()
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage