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
Freigeben: 2024-12-16 06:02:11
Original
841 Leute haben es durchsucht

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

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

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

Diese Änderung führte zur Erstellung von über 200 Threads, wie das zeigt Befehl:

$ cat /proc/17033/status | grep -i thread
Threads:    203
Nach dem Login kopieren

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!

Quelle:php.cn
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage