提问人:Josh Chiu 提问时间:8/3/2023 更新时间:8/3/2023 访问量:105
如何对 io 进行非阻塞 Read()。PipeRaeder 在 Golang
How to do non-blocking Read() for io.PipeRaeder in Golang
问:
我有以下代码。可执行程序将在 5 秒后向 stdout 发送一些文本。所以,在。ReadLine() 将阻塞,直到收到数据。如何为 ReadLine() 设置超时或以非阻塞方式进行设置?
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))
}
答:
1赞
Josh Chiu
8/3/2023
#1
感谢您的评论。我想通了。
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
}
}
}
评论