Go 当前正在写入的流文件

Go 当前正在写入的流文件,go,Go,在goroutine中,是否可以在子流程命令写入文件时对其进行流式处理?这里的目标是将输出捕获为文件并实时流式传输。我有: cmd := exec.CommandContext(ctx, c.Bin, args...) // CANT USE NON FILE!! // https://github.com/golang/go/issues/23019 tempout, err := ioutil.TempFile("", "workerout") if

在goroutine中,是否可以在子流程命令写入文件时对其进行流式处理?这里的目标是将输出捕获为文件并实时流式传输。我有:

cmd := exec.CommandContext(ctx, c.Bin, args...)
// CANT USE NON FILE!!
// https://github.com/golang/go/issues/23019
tempout, err := ioutil.TempFile("", "workerout")
if err != nil {
    return "", err
}
tempoutName := tempout.Name()
defer os.Remove(tempoutName) // clean up

temperr, err := ioutil.TempFile("", "workererr")
if err != nil {
    return "", err
}
temperrName := temperr.Name()
defer os.Remove(temperrName) // clean up

cmd.Stdout = tempout
cmd.Stderr = temperr

err = cmd.Start()

// Stream the logs
// Does not work. Flushing issue???
/*
    ro := bufio.NewReader(tempout)

    go func() {
        line, _, _ := ro.ReadLine()
        logger.Debug(line)
    }()

    re := bufio.NewReader(temperr)

    go func() {
        line, _, _ := re.ReadLine()
        logger.Error(line)
    }()
*/
cmd.Wait()
return tempout.Read(... // read the file into a string and return it

代码中注释掉的部分似乎只在命令退出时显示日志(ctx被取消,或者它完成),因为它不会实时登录。有没有办法实时登录此日志?

@MuffinTop此问题是评论中链接的github问题。如果您知道如何在解决这个问题的同时改进我的代码(我必须有一个文件接口!),那么我很乐意接受这个答案。明确地说,我需要返回文件,还需要实时日志,这个问题迫使我拥有一个文件接口。具体地说,我必须解决这个问题:这是一个terraform命令,当传输到MultiWriter时,它会实时显示日志;它只是在我上面链接的代码中被“缓冲”了,这是不起作用的。我想试试你的游乐场。我可能需要这样做:如果你想读取数据流,那么使用StdoutPipe,如图所示。如果流是“chunky”,那么问题在于child命令。@MuffinTop问题在于注释中链接的github问题。如果您知道如何在解决这个问题的同时改进我的代码(我必须有一个文件接口!),那么我很乐意接受这个答案。明确地说,我需要返回文件,还需要实时日志,这个问题迫使我拥有一个文件接口。具体地说,我必须解决这个问题:这是一个terraform命令,当传输到MultiWriter时,它会实时显示日志;它只是在我上面链接的代码中被“缓冲”了,这是不起作用的。我想试试你的游乐场。我可能需要这样做:如果你想读取数据流,那么使用StdoutPipe,如图所示。如果流是“chunky”,那么问题在于child命令。