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
Lepaskan: 2024-12-24 00:18:15
asal
801 orang telah melayarinya

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()
Salin selepas log masuk

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

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!

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