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
Susan Sarandonoriginal
2024-12-14 17:30:10461parcourir

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()
}

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:
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