测试我的代码不等待的 Goroutine
Testing Goroutine That My Code Does Not Wait For
我有一个并发执行的函数。它的任务是 运行 命令行方法,如果有错误则记录错误。我的主执行线程不等待此方法完成。它只是 return 乐观。
如何测试我的函数?假设我给它一个 cmdStr
,比如 {"sleep", "1"}
,它可以工作但不会立即 return,我怎样才能让我的测试等待这个函数完成?
我想确保 运行 执行此操作的实际程序 而不是 必须等待它完成。
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()
永远不会 return 这样,你应该明确地终止进程。
等别人也比较温和runtime.Goshed()
,但是不能提供这么强的保证。
规范的方式是
wg := sync.WaitGroup
...
wg.Add(1)
go runCmd(...)
...
wg.Wait()
我有一个并发执行的函数。它的任务是 运行 命令行方法,如果有错误则记录错误。我的主执行线程不等待此方法完成。它只是 return 乐观。
如何测试我的函数?假设我给它一个 cmdStr
,比如 {"sleep", "1"}
,它可以工作但不会立即 return,我怎样才能让我的测试等待这个函数完成?
我想确保 运行 执行此操作的实际程序 而不是 必须等待它完成。
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()
永远不会 return 这样,你应该明确地终止进程。
等别人也比较温和runtime.Goshed()
,但是不能提供这么强的保证。
规范的方式是
wg := sync.WaitGroup
...
wg.Add(1)
go runCmd(...)
...
wg.Wait()