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.
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
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!