Streaming-Befehlsausgabefortschritt
Frage:
Wie kann ich die Ausgabe von einem Long streamen? -running-Befehl, der intermittierende Aktualisierungen anstelle einer endgültigen Aktualisierung bereitstellt Ergebnis?
Antwort:
Durch die Verwendung der bufio.NewScanner()-Funktion mit bufio.ScanLines() können Sie die Ausgabe eines Befehls Zeile für Zeile lesen , Streaming der Ergebnisse, sobald sie verfügbar sind. Unten ist ein modifiziertes Beispiel basierend auf Ihrem bereitgestellten Code:
func main() { cmd := exec.Command("go", "run", "child_process.go") stdout, _ := cmd.StdoutPipe() cmd.Start() scanner := bufio.NewScanner(stdout) for scanner.Scan() { fmt.Println(scanner.Text()) log.Printf(scanner.Text()) } cmd.Wait() }
Damit dies effektiv funktioniert, sollte der ausgeführte Befehl den Fortschritt mit fmt.Println() oder log.Printf() ausgeben.
Mögliche Fallstricke:
Alternative Lösungen:
In Fällen, in denen Zeilenumbrüche nicht zuverlässig sind, können alternative Methoden hilfreich sein beschäftigt:
Achtung:
Das byteweise oder runenweise Lesen kann zu Problemen mit Multibyte-UTF-8 führen kodierte Zeichen. Es sollte ein Puffer verwendet werden, der groß genug ist, um UTF-8-Runen zu erfassen.
Das obige ist der detaillierte Inhalt vonWie streame ich den Fortschritt der Ausgabe eines Befehls mit langer Laufzeit in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!