首頁 >後端開發 >Golang >如何在 Go 中串流長時間運行命令的輸出進度?

如何在 Go 中串流長時間運行命令的輸出進度?

Susan Sarandon
Susan Sarandon原創
2024-12-14 17:30:10459瀏覽

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

串流指令輸出進度

問題:

如何從長流中流式輸出- 運行命令,提供間歇性更新而不是最終更新結果?

答案:

使用bufio.NewScanner() 函數和bufio.ScanLines() 可以讓您逐行讀取命令列的輸出,在結果可用時對其進行串流。以下是根據您提供的程式碼修改的範例:

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

為了使其有效運作,執行的命令應使用 fmt.Println() 或 log.Printf() 輸出進度。

可能的陷阱:

  • 如果指令不列印換行符、ScanLines() 只有在指令完成後才會產生輸出。
  • 預設情況下,除非明確連接到另一個進程,否則標準輸出和錯誤流將被丟棄。這可能會導致阻塞問題,因此建議讀取兩個流。

替代解決方案:

如果換行符不可靠,可以使用替代方法僱用:

  • ScanR unes:使用單一字元讀取bufio.ScanRunes().
  • 手動讀取:以位元組或符文方式讀取,不依賴bufio.Scanner。

注意:

按字節或按符文讀取可能會帶來問題具有多字節 UTF-8 編碼字元。應使用足夠大的緩衝區來捕獲 UTF-8 符文。

以上是如何在 Go 中串流長時間運行命令的輸出進度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn