Überlegungen zur Parallelität beim Schreiben in Standard Out in Golang
Frage:
Ist es sicher, Ausgaben gleichzeitig in das Betriebssystem zu schreiben? .Stdout aus mehreren Goroutinen?
Codebeispiel:
<code class="go">package main
import (
"fmt"
"os"
"strings"
)
func main() {
x := strings.Repeat(" ", 1024)
go func() {
for {
fmt.Fprintf(os.Stdout, x+`aa\n`)
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+`bb\n`)
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+`cc\n`)
}
}()
go func() {
for {
fmt.Fprintf(os.Stdout, x+`dd\n`)
}
}()
<-make(chan bool)
}</code>
Nach dem Login kopieren
Antwort:
Der bereitgestellte Code wird nicht angezeigt in einem Datenwettlauf. Die Reihenfolge der in os.Stdout geschriebenen Daten ist jedoch nicht deterministisch und kann je nach Ausführung variieren.
Erklärung:
- Die Funktionen im fmt Pakete sind für die gleichzeitige Verwendung sicher, d. h. sie sind für die Verarbeitung gleichzeitiger Aufrufe konzipiert.
- os.Stdout implementiert die io.Writer-Schnittstelle. Allerdings legt die io.Writer-Schnittstelle kein Parallelitätsverhalten fest.
- In der Praxis umschließt os.Stdout auf Unix-ähnlichen Systemen üblicherweise einen Dateideskriptor, der für Schreibvorgänge atomar ist. Dies bedeutet, dass Schreibvorgänge in os.Stdout von mehreren Goroutinen nicht zu Datenbeschädigungen oder Überlappungen führen.
- Die Reihenfolge, in der Daten in os.Stdout geschrieben werden, wird jedoch vom Kernel und der Hardware bestimmt. Es kann nicht garantiert werden, dass die Daten in der richtigen Reihenfolge geschrieben werden.
Empfehlungen:
- Um eine geordnete Ausgabe sicherzustellen, verwenden Sie den Typ sync.Mutex um den Zugriff auf os.Stdout zu serialisieren.
- Erwägen Sie alternativ die Verwendung des Protokollpakets anstelle von fmt, da es synchronisierte Protokollierungsfunktionen bietet.
Das obige ist der detaillierte Inhalt vonIst gleichzeitiges Schreiben in os.Stdout in Golang sicher und deterministisch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!