流式命令从Goroutine输出进度
问题解决了打印长时间运行的命令的进度问题 我试图将打印代码放入goroutine中,但扫描仪声称已立即命中流式命令从Goroutine输出进度,go,execution,Go,Execution,问题解决了打印长时间运行的命令的进度问题 我试图将打印代码放入goroutine中,但扫描仪声称已立即命中EOF,并且for块从未执行 第一次执行scan()方法时执行的bufio.scan代码是: // We cannot generate a token with what we are holding. // If we've already hit EOF or an I/O error, we are done. if s.err != nil {
EOF
,并且for块从未执行
第一次执行scan()
方法时执行的bufio.scan
代码是:
// We cannot generate a token with what we are holding.
// If we've already hit EOF or an I/O error, we are done.
if s.err != nil {
// Shut it down.
s.start = 0
s.end = 0
return false
}
如果我打印s.err
,则输出为EOF
我尝试运行的代码是:
cmd:=exec.Command(“some”,“Command”)
c:=make(chan int,1)
go func(cmd*exec.cmd,c chan int){
stdout,:=cmd.StdoutPipe()
存在一些问题:
- 在读取所有数据之前,正在关闭管道
- 始终检查错误
- 在godocs的
c之后启动cmd.Start()
StdoutPipe返回将连接到命令的
命令启动时的标准输出
Wait将在看到命令退出后关闭管道,因此大多数
调用者不需要自己关闭管道;但是,这意味着
在管道中的所有读取完成之前调用Wait是不正确的
完成
启动命令后立即调用Wait()
。因此,在确保已从管道读取所有数据之前,命令完成后管道将立即关闭。请尝试在扫描循环后将Wait()
移动到go例程
go func(cmd *exec.Cmd, c chan int) {
stdout, _ := cmd.StdoutPipe()
<-c
scanner := bufio.NewScanner(stdout)
for scanner.Scan() {
m := scanner.Text()
fmt.Println(m)
}
cmd.Wait()
c <- 1
}(cmd, c)
cmd.Start()
c <- 1
// This is here so we don't exit the program early,
<-c
谢谢,1)很好。如果我想同时处理Stdout和Stderr,我想我可以使用2个通道和2个go例程(每种管道类型一个)。
cmd := exec.Command("some", "command")
cmd.Stdout = os.Stdout
cmd.Run()