我有一个带有多个 goroutine 的 go 程序。我遇到了这个错误,但我不明白为什么。这是我的代码逻辑:
主程序
for {
...
go funcFile2()
}
Run Code Online (Sandbox Code Playgroud)
其中 funcFile2 在 File2.go 中定义,并在某种循环中被多次调用
文件2.go
var wg sync.WaitGroup
func func1(){
defer wg.Done()
return
}
func func2(){
defer wg.Done()
return
}
func func3(){
defer wg.Done()
return
}
func funcFile2(){
wg.Add(3)
go func1()
go func2()
go func3()
wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)
GO版本:go1.12.7
我该如何解决?
如果从多个 goroutine 调用 funcfile2() ,那么它们都共享相同的 WaitGroup wg,这是有效的。您会收到此错误,因为在其中一个 Goroutine 中调用了 wg.Wait(),然后在另一个 Goroutine 中调用了 wg.Add(3),这是无效的。一旦等待组开始等待,您就无法向其添加更多内容。
对于每个调用 funcfile2() 的 goroutine 必须有一个单独的等待组。如果这是在 for 循环中,您可以执行以下操作:
for {
wg:=sync.WaitGroup{}
go funcfile2(&wg)
}
Run Code Online (Sandbox Code Playgroud)
这样每个调用 funcfile2 的 goroutine 将使用自己的 waitgroup。当然,funcfile2 必须将相同的 waitgroup 传递给它创建的 goroutine。
| 归档时间: |
|
| 查看次数: |
3131 次 |
| 最近记录: |