在多个go例程中返回上一个等待之前重用WaitGroup

在多个go例程中返回上一个等待之前重用WaitGroup,go,Go,我有一个包含多个goroutine的go程序。我遇到了这个错误,我不知道为什么。这是我的代码逻辑: main.go for { ... go funcFile2() } var wg sync.WaitGroup func func1(){ defer wg.Done() return } func func2(){ defer wg.Done() return } func func3(){ defer wg.Done() ret

我有一个包含多个goroutine的go程序。我遇到了这个错误,我不知道为什么。这是我的代码逻辑:

main.go

for {
   ...
   go funcFile2()
}
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()
}
其中,funcFile2在File2.go中定义,并在某种循环中多次调用

File2.go

for {
   ...
   go funcFile2()
}
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()
}
GO版本:go1.12.7

如何解决?

如果从多个goroutine调用funcfile2(),则它们都共享相同的WaitGroup wg,这是有效的。出现此错误是因为在一个goroutine中调用了wg.Wait(),然后在另一个goroutine中调用了wg.Add(3),这是无效的。一旦waitgroup开始等待,您就无法向其添加更多内容

对于调用funcfile2()的每个goroutine,必须有一个单独的waitgroup。如果这是for循环,您可以执行以下操作:

for {
   wg:=sync.WaitGroup{}
   go funcfile2(&wg)
}
这样,每个调用funcfile2的goroutine都将使用自己的waitgroup。当然,funcfile2必须将相同的waitgroup传递给它创建的goroutine。

如果从多个goroutine调用funcfile2(),则它们都共享相同的waitgroup wg,这是有效的。出现此错误是因为在一个goroutine中调用了wg.Wait(),然后在另一个goroutine中调用了wg.Add(3),这是无效的。一旦waitgroup开始等待,您就无法向其添加更多内容

对于调用funcfile2()的每个goroutine,必须有一个单独的waitgroup。如果这是for循环,您可以执行以下操作:

for {
   wg:=sync.WaitGroup{}
   go funcfile2(&wg)
}

这样,每个调用funcfile2的goroutine都将使用自己的waitgroup。当然,funcfile2必须将相同的waitgroup传递给它创建的goroutines。

这解决了我的问题!感谢
WaitGroup
s可以在多个go例程之间共享。然而,
WaitGroup
的概念涵盖了一项特定的任务。因为有多个任务,所以正如这个答案所示,每个任务都需要单独的
WaitGroup
s。每个任务没有一个WG的内在要求。你可以用任何适合的方式来使用它。@Adrian当然这只是一个计数器——一个不能低于零的计数器。但它的名字暗示它“等待”一个代表更大任务的“组”(子任务)。它的名字暗示它“等待”一个“组”-“任务”不在其中。“等待组等待goroutine集合完成”。具体来说,它等待agroup的是goroutines。“任务”是一个你可能会觉得有用的概念,但它与WaitGroups无关。这解决了我的问题!感谢
WaitGroup
s可以在多个go例程之间共享。然而,
WaitGroup
的概念涵盖了一项特定的任务。因为有多个任务,所以正如这个答案所示,每个任务都需要单独的
WaitGroup
s。每个任务没有一个WG的内在要求。你可以用任何适合的方式来使用它。@Adrian当然这只是一个计数器——一个不能低于零的计数器。但它的名字暗示它“等待”一个代表更大任务的“组”(子任务)。它的名字暗示它“等待”一个“组”-“任务”不在其中。“等待组等待goroutine集合完成”。具体来说,它等待agroup的是goroutines。“Task”是一个您可能会觉得有用的概念,但它与WaitGroups无关。示例代码没有说明所述的问题。请提供一个示例,说明问题的实际原因。示例代码没有说明所述问题。请提供一份报告,说明问题的真正原因。