Heim > Backend-Entwicklung > Golang > Wie streame ich den Fortschritt der Ausgabe eines Befehls mit langer Laufzeit in Go?

Wie streame ich den Fortschritt der Ausgabe eines Befehls mit langer Laufzeit in Go?

Susan Sarandon
Freigeben: 2024-12-14 17:30:10
Original
461 Leute haben es durchsucht

How to Stream the Progress of a Long-Running Command's Output in Go?

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

Damit dies effektiv funktioniert, sollte der ausgeführte Befehl den Fortschritt mit fmt.Println() oder log.Printf() ausgeben.

Mögliche Fallstricke:

  • Wenn der Befehl keine Zeilenumbrüche druckt, liefert ScanLines() nur dann eine Ausgabe, wenn die Der Befehl wird beendet.
  • Standardmäßig werden Standardausgabe- und Fehlerströme verworfen, sofern sie nicht explizit mit einem anderen Prozess verbunden sind. Dies kann zu Blockierungsproblemen führen, daher wird empfohlen, beide Streams zu lesen.

Alternative Lösungen:

In Fällen, in denen Zeilenumbrüche nicht zuverlässig sind, können alternative Methoden hilfreich sein beschäftigt:

  • ScanRunes: Von einzelnen Zeichen gelesen mit bufio.ScanRunes().
  • Manuelles Lesen: Byteweises oder runenweises Lesen, ohne auf bufio.Scanner angewiesen zu sein.

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!

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