测试我的代码不等待的 Goroutine

Testing Goroutine That My Code Does Not Wait For

我有一个并发执行的函数。它的任务是 运行 命令行方法,如果有错误则记录错误。我的主执行线程不等待此方法完成。它只是 return 乐观。

如何测试我的函数?假设我给它一个 cmdStr,比如 {"sleep", "1"},它可以工作但不会立即 return,我怎样才能让我的测试等待这个函数完成?

我想确保 运行 执行此操作的实际程序 而不是 必须等待它完成。

func runCmd(cmdStr []string, errChan chan error) {
  cmd := exec.Command(cmdStr...)
  var out bytes.Buffer
  cmd.Stdout = &out
  err := cmd.Start()
  if err != nil {
    errChan <- err
    return
  }
  // Command started successfully, so our caller can continue.
  errChan <- nil
  err = cmd.Wait()
  if err != nil {
    log.Println(err)
  }
}

使用等待组

wg := sync.WaitGroup{}
errc := make(chan error)
wg.Add(1)
go func() {
    runCmd([]string{"sleep", 1}, errc)
    wg.Done()
}()
err <- errc
if err != nil {
    // handle error
}
wg.Wait()

了解所有 gorouting 完成的最简单方法是添加 select{} 作为最后一个 main.main() 语句。但是 main() 永远不会 return 这样,你应该明确地终止进程。 等别人也比较温和runtime.Goshed(),但是不能提供这么强的保证。 规范的方式是

wg := sync.WaitGroup
...
wg.Add(1)
go runCmd(...)
...
wg.Wait()