我有一个并发执行的函数。它的任务是运行一个命令行方法,如果有错误就记录一个错误。我的主执行线程不等待此方法完成。它只是乐观地返回。如何测试我的功能?假设我给它一个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) }}
2 回答
ibeautiful
TA贡献1993条经验 获得超5个赞
使用等待组
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()
慕运维8079593
TA贡献1876条经验 获得超5个赞
了解所有已完成的路由的最简单方法是添加select{}为最后一条main.main()语句。但是main()永远不会以这种方式返回,您应该明确地终止进程。runtime.Goshed()等待别人也比较温柔,却无法提供如此有力的保证。规范的方式是
wg := sync.WaitGroup
...
wg.Add(1)
go runCmd(...)
...
wg.Wait()
- 2 回答
- 0 关注
- 128 浏览
添加回答
举报
0/150
提交
取消