Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menstrim Output Separa daripada Perintah Jangka Panjang dalam Go?

Bagaimana untuk Menstrim Output Separa daripada Perintah Jangka Panjang dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-24 00:18:15872semak imbas

How to Stream Partial Output from a Long-Running Command in Go?

Streaming Kemajuan Output Perintah

Dalam senario di mana arahan jangka panjang dilaksanakan dan outputnya perlu terus disalurkan ke proses induk dan ke fail log , kaedah cmd.StdoutPipe() boleh digunakan untuk menangkap output.

cmd := exec.Command("sh", "-c", "some long runnig task")

stdout, _ := cmd.StdoutPipe()
cmd.Start()

scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
    m := scanner.Text()
    fmt.Println(m)
    log.Printf(m)
}

cmd.Wait()

Walau bagaimanapun, pendekatan ini hanya menyediakan output akhir sebagai rentetan tunggal, bukan menstrimkan hasil separa.

Sebab Output Terhad

Bufio.NewScanner () fungsi beroperasi pada baris, mengembalikan baris lengkap apabila aksara baris baharu ditemui. Jika arahan yang dilaksanakan tidak menghasilkan aksara baris baharu, output tidak akan distrim serta-merta.

Penyelesaian Kemungkinan

Untuk menangani had ini, terdapat beberapa pendekatan yang perlu dipertimbangkan:

  1. Membaca dengan Perkataan atau Aksara:
    Dengan menetapkan fungsi split menggunakan Scanner.Split(), anda boleh mengimbas input dengan perkataan atau aksara, menangkap output semasa ia dihasilkan.

    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
  2. Bacaan Manual:
    Membaca bait demi bait atau rune-by-rune membolehkan anda tangkap output semasa ia dijana, tanpa bergantung pada aksara baris baharu.

    oneByte := make([]byte, 1)
    for {
        _, err := stdout.Read(oneByte)
        if err != nil {
            break
        }
        fmt.Printf("%c", oneByte[0])
    }
    
    oneRune := make([]byte, utf8.UTFMax)
    for {
        count, err := stdout.Read(oneRune)
        if err != nil {
            break
        }
        fmt.Printf("%s", oneRune[:count])
    }

Pertimbangan

Adalah penting untuk mengurus saiz penimbal untuk output standard dan aliran ralat dalam kanak-kanak proses. Secara lalai, jika penimbal ini tidak dibaca, ia boleh menyebabkan proses kanak-kanak digantung. Oleh itu, adalah disyorkan untuk sentiasa membaca kedua-dua strim stdout dan stderr.

Atas ialah kandungan terperinci Bagaimana untuk Menstrim Output Separa daripada Perintah Jangka Panjang dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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