Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menstrim Output Perintah dalam Masa Nyata Daripada Menunggu Penyelesaian Pelaksanaan?

Bagaimana untuk Menstrim Output Perintah dalam Masa Nyata Daripada Menunggu Penyelesaian Pelaksanaan?

Mary-Kate Olsen
Lepaskan: 2024-11-17 21:00:03
asal
408 orang telah melayarinya

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

Menjalankan Perintah dan Menstrim Outputnya

Masalah: Paparan Output Tertunda

Pada masa ini, kod anda memproses arahan dan hanya memaparkan outputnya sebaik sahaja pelaksanaan selesai. Anda mencari penyelesaian untuk menstrim output secara langsung dan bukannya menunggu proses selesai.

Penyelesaian: Penstriman Output Perintah

Gunakan pendekatan berikut untuk menstrim output arahan:

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:])
}
Salin selepas log masuk

Penjelasan

  • cmd.StdoutPipe() mencipta paip yang akan membekalkan sebarang output yang ditulis oleh arahan.
  • pengimbas := bufio.NewScanner(stdout) memulakan pengimbas yang akan membaca output daripada paip.
  • scanner.Split(bufio.ScanRunes) memastikan pengimbas membaca dan memproses setiap aksara (rune) output.
  • Gelung for membaca aksara secara berterusan daripada paip stdout dan mencetaknya ke skrin.
  • Selepas pelaksanaan arahan selesai, cmd.Wait() menyemak kejayaan atau kegagalannya dan merekodkan hasilnya.

Atas ialah kandungan terperinci Bagaimana untuk Menstrim Output Perintah dalam Masa Nyata Daripada Menunggu Penyelesaian Pelaksanaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan