首页 > 后端开发 > Golang > 如何在 Go 中流式传输长时间运行命令的输出进度?

如何在 Go 中流式传输长时间运行命令的输出进度?

Susan Sarandon
发布: 2024-12-14 17:30:10
原创
458 人浏览过

How to Stream the Progress of a Long-Running Command's Output in Go?

流式传输命令输出进度

问题:

如何从长流中流式输出- 运行命令,提供间歇性更新而不是最终更新结果?

答案:

使用 bufio.NewScanner() 函数和 bufio.ScanLines() 可以让您逐行读取命令行的输出,在结果可用时对其进行流式传输。以下是根据您提供的代码修改的示例:

func main() {
    cmd := exec.Command("go", "run", "child_process.go")

    stdout, _ := cmd.StdoutPipe()
    cmd.Start()

    scanner := bufio.NewScanner(stdout)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
        log.Printf(scanner.Text())
    }

    cmd.Wait()
}
登录后复制

为了使其有效工作,执行的命令应使用 fmt.Println() 或 log.Printf() 输出进度。

可能的陷阱:

  • 如果命令不打印换行符、ScanLines() 仅在命令完成后才会产生输出。
  • 默认情况下,除非显式连接到另一个进程,否则标准输出和错误流将被丢弃。这可能会导致阻塞问题,因此建议读取两个流。

替代解决方案:

如果换行符不可靠,可以使用替代方法雇用:

  • ScanRunes:使用单个字符读取bufio.ScanRunes().
  • 手动读取:按字节或符文方式读取,不依赖 bufio.Scanner。

注意:

按字节或按符文读取可能会带来问题具有多字节 UTF-8 编码字符。应使用足够大的缓冲区来捕获 UTF-8 符文。

以上是如何在 Go 中流式传输长时间运行命令的输出进度?的详细内容。更多信息请关注PHP中文网其他相关文章!

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