猿问

测试我的代码不等待的 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)

  }

}


哔哔one
浏览 129回答 2
2回答

ibeautiful

使用等待组wg := sync.WaitGroup{}errc := make(chan error)wg.Add(1)go func() {&nbsp; &nbsp; runCmd([]string{"sleep", 1}, errc)&nbsp; &nbsp; wg.Done()}()err <- errcif err != nil {&nbsp; &nbsp; // handle error}wg.Wait()

慕运维8079593

了解所有已完成的路由的最简单方法是添加select{}为最后一条main.main()语句。但是main()永远不会以这种方式返回,您应该明确地终止进程。runtime.Goshed()等待别人也比较温柔,却无法提供如此有力的保证。规范的方式是wg := sync.WaitGroup...wg.Add(1)go runCmd(...)...wg.Wait()
随时随地看视频慕课网APP

相关分类

Go
我要回答