Di Golang, io.PipeReader ialah pembaca yang biasa digunakan, tetapi kaedah Read()nya menyekat pelaksanaan program apabila tiada data untuk dibaca. Jadi bagaimana untuk melaksanakan bacaan tidak menyekat io.PipeReader? Editor PHP Xiaoxin memberi anda penyelesaian Dengan menggunakan pilih dan goroutine, kami boleh mencapai bacaan io.PipeReader tanpa menyekat, dengan itu meningkatkan responsif dan keselarasan program. Berikut akan memperkenalkan secara terperinci cara melaksanakan fungsi ini dan memberikan kod sampel.
Saya ada kod berikut. Selepas 5 saat, boleh laku akan menghantar beberapa teks ke stdout. Oleh itu, in.readline() akan menyekat sehingga data diterima. Bagaimanakah saya boleh menetapkan tamat masa untuk readline() atau melaksanakannya dengan cara yang tidak menyekat?
package main import ( "bufio" "fmt" "io" "os/exec" ) func main() { cmd := exec.Command("/path/to/executable") stdoutReader, stdoutWriter := io.Pipe() cmd.Stdout = stdoutWriter cmd.Start() in := bufio.NewReader(stdoutReader) b, _, _ := in.ReadLine() fmt.Println(string(b)) }
Terima kasih atas komen anda. saya nampak.
package main import ( "bufio" "fmt" "io" "os/exec" "time" ) func main() { ch := make(chan []byte) cmd := exec.Command("/path/to/executable") stdoutReader, stdoutWriter := io.Pipe() cmd.Stdout = stdoutWriter if err := cmd.Start(); err != nil { return } in := bufio.NewReader(stdoutReader) go func() { b, _, _ := in.ReadLine() ch <- b }() complete := false for !complete { select { case s := <-ch: fmt.Println(string(s)) complete = true case <-time.After(time.Second * 5): fmt.Println("timeout") complete = true } } }
Atas ialah kandungan terperinci Bagaimana untuk melakukan Baca tanpa menyekat () pada io.PipeRaeder di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!