Warum eine minimale Thread-Erstellung bei Dateischreibblockaden in Go auftritt
Wenn Goroutinen in Go Aufrufe blockieren, werden in der Regel Threads erstellt solche Operationen erleichtern. Eine rätselhafte Beobachtung ergibt sich jedoch, wenn mehrere Goroutinen beim Versuch, in eine Datei zu schreiben, blockiert werden. Trotz der Anwesenheit zahlreicher Goroutinen wird eine begrenzte Anzahl von Threads eingerichtet.
Testcode und Beobachtungen
Das folgende Testskript demonstriert dieses Verhalten:
package main import ( "io/ioutil" "os" "runtime" "strconv" ) func main() { runtime.GOMAXPROCS(2) data, err := ioutil.ReadFile("./55555.log") if err != nil { println(err) return } for i := 0; i < 200; i++ { go func(n int) { for { err := ioutil.WriteFile("testxxx"+strconv.Itoa(n), []byte(data), os.ModePerm) if err != nil { println(err) break } } }(i) } select {} }
Ironischerweise werden bei der Ausführung dieses Skripts nur eine Handvoll Threads erstellt, wie durch das angegeben Befehl:
$ cat /proc/9616/status | grep -i thread Threads: 5
Das Rätsel lösen
Der Schlüssel zum Verständnis dieses Verhaltens liegt in der Art des Blockierungsvorgangs. Im ursprünglichen Test werden die Dateischreibvorgänge zu schnell abgeschlossen, um die Erstellung neuer Threads auszulösen.
Um dies zu veranschaulichen, wurde das Testskript geändert, um einen viel größeren Datenblock zu schreiben:
package main import ( "io/ioutil" "os" "runtime" "strconv" ) func main() { runtime.GOMAXPROCS(2) data := make([]byte, 128*1024*1024) for i := 0; i < 200; i++ { go func(n int) { for { err := ioutil.WriteFile("testxxx"+strconv.Itoa(n), []byte(data), os.ModePerm) if err != nil { println(err) break } } }(i) } select {} }
Diese Änderung führte zur Erstellung von über 200 Threads, wie das zeigt Befehl:
$ cat /proc/17033/status | grep -i thread Threads: 203
Schlussfolgerung
Wenn also Dateischreibvorgänge schnell ausgeführt werden, reicht die blockierende Natur der Aufrufe möglicherweise nicht aus, um die Erstellung mehrerer Aufrufe auszulösen Threads. Erst wenn die Blockierungsvorgänge umfangreicher werden, wird der Bedarf an zusätzlichen Threads deutlich, was wie erwartet zu einer Zunahme der Threads führt.
Das obige ist der detaillierte Inhalt vonWarum erstellt Go nur wenige Threads, wenn viele Goroutinen das schnelle Schreiben von Dateien blockieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!