ホームページ > バックエンド開発 > Golang > Go で長時間実行されるコマンドの出力の進行状況をストリーミングするにはどうすればよいですか?

Go で長時間実行されるコマンドの出力の進行状況をストリーミングするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-14 17:30:10
オリジナル
461 人が閲覧しました

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

ストリーミング コマンド出力の進行状況

質問:

長いコマンドから出力をストリーミングするにはどうすればよいですか? -running コマンド。最終更新ではなく、断続的な更新を提供します。 result?

答え:

bufio.ScanLines() で bufio.NewScanner() 関数を使用すると、コマンドの出力を 1 行ずつ読み取ることができます。 、結果が利用可能になったらストリーミングします。以下は、提供されたコードに基づいて変更された例です:

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() を使用して進行状況を出力する必要があります。

考えられる落とし穴:

  • コマンドが出力されない場合newlines、ScanLines() は、コマンドが完了すると出力のみを生成します。
  • デフォルトでは、別のプロセスに明示的に接続しない限り、標準出力とエラー ストリームは破棄されます。これによりブロックの問題が発生する可能性があるため、両方のストリームを読み取ることをお勧めします。

代替解決策:

改行文字が信頼できない場合は、代替方法を使用できます。雇用:

  • ScanRunes: 個人で読むbufio.ScanRunes() を使用した文字。
  • 手動読み取り: bufio.Scanner に依存しないバイト単位またはルーン単位の読み取り。

注意:

バイト単位での読み取り、またはrunewise では、マルチバイト UTF-8 エンコード文字に関する問題が発生する可能性があります。 UTF-8 ルーンをキャプチャするのに十分な大きさのバッファを使用する必要があります。

以上がGo で長時間実行されるコマンドの出力の進行状況をストリーミングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート