如何在Golang中为io.PipeRaeder执行非阻塞Read()

7gs2gvoe  于 2023-10-14  发布在  Go
关注(0)|答案(1)|浏览(116)

我有以下代码。可执行程序将在5秒后向stdout发送一些文本。因此,在接收数据之前,in.ReadLine()将阻塞。如何为ReadLine()设置超时或以非阻塞方式设置?

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os/exec"
  7. )
  8. func main() {
  9. cmd := exec.Command("/path/to/executable")
  10. stdoutReader, stdoutWriter := io.Pipe()
  11. cmd.Stdout = stdoutWriter
  12. cmd.Start()
  13. in := bufio.NewReader(stdoutReader)
  14. b, _, _ := in.ReadLine()
  15. fmt.Println(string(b))
  16. }
nhaq1z21

nhaq1z211#

谢谢你的评论。我自己想出来的。

  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "io"
  6. "os/exec"
  7. "time"
  8. )
  9. func main() {
  10. ch := make(chan []byte)
  11. cmd := exec.Command("/path/to/executable")
  12. stdoutReader, stdoutWriter := io.Pipe()
  13. cmd.Stdout = stdoutWriter
  14. if err := cmd.Start(); err != nil {
  15. return
  16. }
  17. in := bufio.NewReader(stdoutReader)
  18. go func() {
  19. b, _, _ := in.ReadLine()
  20. ch <- b
  21. }()
  22. complete := false
  23. for !complete {
  24. select {
  25. case s := <-ch:
  26. fmt.Println(string(s))
  27. complete = true
  28. case <-time.After(time.Second * 5):
  29. fmt.Println("timeout")
  30. complete = true
  31. }
  32. }
  33. }
展开查看全部

相关问题