这是我的代码(writeFromProcessToFileWithMax是一个内部函数,并且工作正常): // Go routines for non-blocking reading of stdout and stderr and writing to files g := new(errgroup.Group) // Read stdout in goroutine. g.Go(func() error { err = writeFromProcessToFileWithMax(stdoutScanner, stdoutFileWriter, maxStdoutFileLengthInGB) if err != nil { log.Error().Err(err).Msgf("Error writing to stdout file: %s", stdoutFilename) return err } return nil }) // Read stderr in goroutine. g.Go(func() error { err = writeFromProcessToFileWithMax(stderrScanner, stderrFileWriter, maxStderrFileLengthInGB) if err != nil { log.Error().Err(err).Msgf("Error writing to stderr file: %s", stderrFilename) return err } return nil }) // Wait the command in a goroutine. g.Go(func() error { return cmd.Wait() }) // Starting the command if err = cmd.Start(); err != nil { log.Error().Err(err).Msg("Error starting command") return err } // Waiting until errorGroups groups are done if err = g.Wait(); err != nil { log.Error().Err(err).Msg("Error during running of the command") }当我运行它时,我得到以下 Error = Error during running of the command error="exec: not started"。但一切正常。它会回来咬我还是我应该压制?
1 回答
一只萌萌小番薯
TA贡献1795条经验 获得超7个赞
cmd在你开始之前你正在等待。在您的旧代码中的大部分时间cmd.Wait()之前都会被调用。(无法保证两个不同的 goroutine 中的事情何时发生,除非您明确使用同步点)cmd.Start()
交换goroutine的顺序cmd.Start()和内部:cmd.Wait()
// Starting the command
if err = cmd.Start(); err != nil {
log.Error().Err(err).Msg("Error starting command")
return err
}
// Wait the command in a goroutine.
g.Go(func() error {
return cmd.Wait()
})
当您启动在启动命令后等待的 goroutine 时,您可以保证以cmd.Start()正确cmd.Wait()的顺序执行。
至于为什么它似乎有效:g.Wait()
“阻塞直到 Go 方法的所有函数调用都返回,然后从它们返回第一个非零错误(如果有的话)。 ”
所以所有的 go 例程都完成了,包括复制输出的例程,然后您会看到执行cmd.Wait().
- 1 回答
- 0 关注
- 141 浏览
添加回答
举报
0/150
提交
取消