Heim >Backend-Entwicklung >Golang >Warum erstellt Go nur wenige Threads, wenn viele Goroutinen das schnelle Schreiben von Dateien blockieren?

Warum erstellt Go nur wenige Threads, wenn viele Goroutinen das schnelle Schreiben von Dateien blockieren?

Susan Sarandon
Susan SarandonOriginal
2024-12-16 06:02:11841Durchsuche

Why Does Go Create Few Threads When Many Goroutines Block on Fast File Writes?

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!

Stellungnahme:
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