为了账号安全,请及时绑定邮箱和手机立即绑定

测试我的代码不等待的 Goroutine

测试我的代码不等待的 Goroutine

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


查看完整回答
反对 回复 2021-09-13
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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


wg := sync.WaitGroup

...

wg.Add(1)

go runCmd(...)

...

wg.Wait()


查看完整回答
反对 回复 2021-09-13
  • 2 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信