Heim > Backend-Entwicklung > Golang > Wie streame ich die Befehlsausgabe in Echtzeit, anstatt auf den Abschluss der Ausführung zu warten?

Wie streame ich die Befehlsausgabe in Echtzeit, anstatt auf den Abschluss der Ausführung zu warten?

Mary-Kate Olsen
Freigeben: 2024-11-17 21:00:03
Original
407 Leute haben es durchsucht

How to Stream Command Output in Real-time Instead of Waiting for Execution Completion?

Einen Befehl ausführen und seine Ausgabe streamen

Problem: Verzögerte Ausgabeanzeige

Derzeit verarbeitet Ihr Code einen Befehl und zeigt seine Ausgabe erst an, wenn die Ausführung abgeschlossen ist. Sie suchen nach einer Lösung, um die Ausgabe live zu streamen, anstatt auf den Abschluss des Prozesses zu warten.

Lösung: Befehlsausgabe-Streaming

Verwenden Sie den folgenden Ansatz zum Streamen von Befehlen Ausgabe:

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}
Nach dem Login kopieren

Erklärung

  • cmd.StdoutPipe() erstellt eine Pipe, die alle vom Befehl geschriebenen Ausgaben bereitstellt.
  • scanner := bufio.NewScanner(stdout) initialisiert einen Scanner, der die Ausgabe von liest Pipe.
  • scanner.Split(bufio.ScanRunes) stellt sicher, dass der Scanner jedes Zeichen (Rune) der Ausgabe liest und verarbeitet.
  • Die for-Schleife liest kontinuierlich Zeichen aus der stdout-Pipe und druckt sie auf den Bildschirm.
  • Nachdem die Befehlsausführung abgeschlossen ist, überprüft cmd.Wait() den Erfolg oder Misserfolg und protokolliert dies Ergebnis.

Das obige ist der detaillierte Inhalt vonWie streame ich die Befehlsausgabe in Echtzeit, anstatt auf den Abschluss der Ausführung zu warten?. 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