首页 > 后端开发 > Golang > 如何在 Golang 中对 io.PipeRaeder 进行非阻塞 Read()

如何在 Golang 中对 io.PipeRaeder 进行非阻塞 Read()

WBOY
发布: 2024-02-10 11:10:17
转载
428 人浏览过

如何在 Golang 中对 io.PipeRaeder 进行非阻塞 Read()

在 Golang 中,io.PipeReader 是一个常用的读取器,但它的 Read() 方法在没有数据可读时会阻塞程序的执行。那么如何实现对 io.PipeReader 进行非阻塞的读取呢?php小编小新为您提供了一种解决方案,通过使用 select 和 goroutine 的方式,我们可以实现对 io.PipeReader 的非阻塞读取,从而提高程序的响应性和并发性。下面将详细介绍如何实现这一功能,并给出示例代码。

问题内容

我有以下代码。 5 秒后,可执行程序将向 stdout 发送一些文本。因此,in.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))
}

登录后复制

解决方法

感谢您的评论。我明白了。

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
        }
    }

}

登录后复制

以上是如何在 Golang 中对 io.PipeRaeder 进行非阻塞 Read()的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:stackoverflow.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板