我有一个同时执行的功能。它的任务是运行命令行方法,如果有错误则记录错误。我的主要执行线程不等待此方法完成。它只是乐观地回报。
我如何测试我的功能?假设我给它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)
}
}
答案 0 :(得分:1)
使用等待组
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()
答案 1 :(得分:0)
了解所有goroutings的最简单方法是添加select{}
作为最后main.main()
语句。但main()
永远不会以这种方式返回,你应该明确地杀死进程。
等待其他人也更温和runtime.Goshed()
,但它无法提供如此强有力的保证。
而规范的方式将是
wg := sync.WaitGroup
...
wg.Add(1)
go runCmd(...)
...
wg.Wait()