Maison > développement back-end > Golang > Comment diffuser la progression de la sortie d'une commande de longue durée dans Go ?

Comment diffuser la progression de la sortie d'une commande de longue durée dans Go ?

Susan Sarandon
Libérer: 2024-12-14 17:30:10
original
548 Les gens l'ont consulté

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

Progression de la sortie de la commande de streaming

Question :

Comment puis-je diffuser la sortie d'un long -commande en cours d'exécution, fournissant des mises à jour intermittentes plutôt qu'une finale résultat ?

Réponse :

Utiliser la fonction bufio.NewScanner() avec bufio.ScanLines() vous permet de lire la sortie d'une commande ligne par ligne , diffusant les résultats dès qu'ils sont disponibles. Vous trouverez ci-dessous un exemple modifié basé sur le code fourni :

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()
}
Copier après la connexion

Pour que cela fonctionne efficacement, la commande exécutée doit afficher la progression à l'aide de fmt.Println() ou log.Printf().

Pièges possibles :

  • Si la commande n'imprime pas les nouvelles lignes, ScanLines() ne produira qu'une sortie une fois la commande terminée.
  • Par défaut, les flux de sortie standard et d'erreur sont ignorés à moins qu'ils ne soient explicitement connectés à un autre processus. Cela peut entraîner des problèmes de blocage, il est donc recommandé de lire les deux flux.

Solutions alternatives :

Dans les cas où les caractères de nouvelle ligne ne sont pas fiables, des méthodes alternatives peuvent être employé :

  • ScanRunes : Lu par des caractères individuels à l'aide bufio.ScanRunes().
  • Lecture manuelle : Lecture par octet ou par rune sans compter sur bufio.Scanner.

Attention :

La lecture par octet ou par rune peut introduire des problèmes avec le multi-octet Caractères codés en UTF-8. Un tampon suffisamment grand pour capturer les runes UTF-8 doit être utilisé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal