go - 在多个go例程中返回先前的Wait之前,WaitGroup被重用

标签 go

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

main.go

for {
   ...
   go funcFile2()
}

其中funcFile2在File2.go中定义,并在某种循环中多次调用

File2.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()
}

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。

关于go - 在多个go例程中返回先前的Wait之前,WaitGroup被重用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57896049/

相关文章:

xml - `,omitempty`和Go 's standard ` xml`包中的指针字段

go - 从扩展中添加虚拟表时如何提供表规范

arrays - 如何将 slice 转换为数组?

go - gRPC 客户端流控制如何在 go 中工作?

linux - go 是否有特定于操作系统的软件包不能在其他操作系统上使用?

go - Helm go sdk 从外部位置安装图表

arrays - []json.Rawmessage 是什么意思

go - defer 会一直等到子程序执行完吗?

pointers - golang如何用指针打印结构值

pointers - 通过将指针传递给 Go 中的函数来获取不同的值