去扫描缓冲区有时挂起

我使用下面的代码可以正常工作,但是在某些情况下,该过程卡住了,并且看不到任何输出。例如,这段代码运行npm installmvn 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
}

现在,如果我像下面那样更改顺序(先犯错,然后是stdout),则在命令挂起时会收到一些错误输出,但是我看不到在线输出,在运行命令时会看到一些输出,并且在完成时你看剩下的了。您可以等待2分钟或更长时间的输出,然后在该过程结束时立即获得长输出。

如何解决我将能够使输出联机并在流程挂起时获得一些反馈的情况?

func exec(stdout io.reader,*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,*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())
        }
}()

}
wanlili3646 回答:去扫描缓冲区有时挂起

在第一种情况下,您正在从流程的标准输出中读取内容,直到流程结束。然后,您从stderr阅读。在第二种情况下,您先从err中读取,然后从中读取。您应该同时阅读它们。要么使用Cmd.CombinedOutput返回它们,要么启动两个goroutine,一个从stdin读取,一个从stderr读取,直到流关闭。

scanout := bufio.NewScanner(stdout)
scanout.Split(bufio.ScanRunes)
go func() {
    for scanout.Scan() {
        fmt.Print(scanout.Text())
     }
}()
本文链接:https://www.f2er.com/3127538.html

大家都在问