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

2024年 2月 10日 100.1k 0

如何在 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 登录后复制

以上就是如何在 Golang 中对 io.PipeRaeder 进行非阻塞 Read()的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论