我在测试中提供了以下代码:
expected := 10
var wg sync.WaitGroup
for i := 0; i < expected; i++ {
go func(wg *sync.WaitGroup) {
wg.Add(1)
defer wg.Done()
// do something
}(&wg)
}
wg.Wait()
令我惊讶的是,我在运行“去测试”时得到了。当用“去测试-比赛”跑步时,我没有感到恐慌,但测试在稍后的某个时刻失败了。在这两种情况下,尽管有一个wg。Wait(),一个戈鲁廷没有完成执行。panic: Fail in goroutine after TestReadWrite has completed
我做了以下更改,现在测试按预期工作:
expected := 10
var wg sync.WaitGroup
wg.Add(expected)
for i := 0; i < expected; i++ {
go func(wg *sync.WaitGroup) {
defer wg.Done()
// do something
}(&wg)
}
wg.Wait()
我的疑虑是:
到目前为止,我看到的很多代码都在戈鲁廷内部。为什么它在这个特定情况下会表现得出乎意料?这里似乎正在发生的事情是,一些戈鲁丁似乎完成了运行,并通过了wg。等候(),在其他戈鲁廷开始运行之前。正在使用工作组。添加(1)在戈鲁丁内危险/要避免?如果这通常不是问题,那么究竟是什么导致了这里的问题?wg.Add(1)
添加解决此问题的正确方法是否正确?wg.Add(expected)
潇湘沐
手掌心
相关分类