Go扫描缓冲区有时挂起

Go扫描缓冲区有时挂起,go,Go,我使用下面的代码,工作正常,但是在某些情况下进程卡住了,我看不到任何输出。示例此代码运行npm install或mvn clean install,大部分时间运行良好,但有时会挂起,无法获得任何输出 func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) { scanout := bufio.NewScanner(stdout) scanerr := bufio.NewScann

我使用下面的代码,工作正常,但是在某些情况下进程卡住了,我看不到任何输出。示例此代码运行
npm install
mvn clean install
,大部分时间运行良好,但有时会挂起,无法获得任何输出

func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {
    scanout := bufio.NewScanner(stdout)
    scanerr := bufio.NewScanner(stderr)

    scanout.Split(bufio.ScanRunes)
    for scanout.Scan() {
        fmt.Print(scanout.Text())
    }

    scanerr.Split(bufio.ScanRunes)
    for scanerr.Scan() {
        fmt.Print(scanerr.Text())
    }
    return scanout, scanerr
}
现在,如果我像下面这样更改顺序(err first和stdout second),当命令挂起时,我会得到一些错误输出,但是我不会在线看到输出,当您运行命令时,您会看到一些输出,当命令完成时,您会看到所有其他输出。您可以等待输出2分钟或更长时间,然后在流程结束时立即获得长输出

我怎样才能修复在进程挂起时能够在线获取输出并获得一些反馈的问题

func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {
    scanout := bufio.NewScanner(stdout)
    scanerr := bufio.NewScanner(stderr)

    scanout.Split(bufio.ScanRunes)
    for scanout.Scan() {
        fmt.Print(scanout.Text())
    }
    scanerr.Split(bufio.ScanRunes)
    for scanerr.Scan() {
        fmt.Print(scanerr.Text())
    }


    }
    return scanout, scanerr
}
更新

应该是这样吗

func exec(stdout io.Reader, stderr io.Reader) (*bufio.Scanner, *bufio.Scanner) {

scanout := bufio.NewScanner(stdout)
scanout.Split(bufio.ScanRunes)
go func() {
    for scanout.Scan() {
        fmt.Print(scanout.Text())
     }
}()

go func() {
scanerr.Split(bufio.ScanRunes)
        for scanerr.Scan() {
            fmt.Print(scanerr.Text())
        }
}()

}

在第一种情况下,您从进程的stdout读取数据,直到进程结束。然后你从报纸上读到。在第二种情况下,首先读取err,然后读取out。你应该读他们两个的书。使用Cmd.CombinedOutput返回这两个数据流,或者启动两个goroutine,一个从stdin读取,一个从stderr读取,直到流关闭

scanout := bufio.NewScanner(stdout)
scanout.Split(bufio.ScanRunes)
go func() {
    for scanout.Scan() {
        fmt.Print(scanout.Text())
     }
}()

我以前使用过合并输出,但遇到了一些问题,然后我切换到这个选项…,你能为第二个选项提供示例吗?为其中一个流添加了一个片段扫描你解释了它的帮助吗?我应该首先使用哪一个?通过阅读goroutines中的流,当执行的程序产生输出时,您可以读取这两个数据。如果您首先从stdin读取,但程序为stderr生成输出,那么如果stderr缓冲区已满,程序将挂起。