测试我的代码不等待的goroutine



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

如何测试我的函数?假设我给它一个cmdStr,例如 {"sleep", "1"} ,它有效但不会立即返回,我如何让我的测试等待这个函数完成?

我想确保运行它的实际程序不必等待它完成。

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()永远不会以这种方式返回,您应该明确终止进程。等待别人也比较温柔runtime.Goshed(),但不能提供这么强的保证。规范的方式将是

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

最新更新