我有一个并发执行的函数。它的任务是运行命令行方法,如果有错误,则记录错误。我的主执行线程不等待此方法完成。它只是乐观地返回。
如何测试我的函数?假设我给它一个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()