gpt4 book ai didi

go - 等待完成后我们是否需要创建新的 WaitGroup ?

转载 作者:IT王子 更新时间:2023-10-29 02:35:40 25 4
gpt4 key购买 nike

我遇到了一些并发问题。我是第一次编写并发应用程序。

我正在努力实现的目标

依赖函数(使用 goroutines)即 func2 依赖于 func1

问题

如果我在完成waiting后重用waitgroup,我会得到一个错误

fatal error: all goroutines are asleep - deadlock!

这是我的代码(Playground):

package main

import (
"fmt"
"sync"
"time"
)

func main() {
wg := sync.WaitGroup{}
ch := make(chan int)
for a := 0; a < 3; a++ {
wg.Add(1)
go func1(int(3-a), ch, &wg)
}
go func() {
wg.Wait()
close(ch)
}()
//wg2 := sync.WaitGroup{} //<-- If I uncomment this and the corresponding wg2 code, then the snippet runs fine
ch2 := make(chan string)
for val := range ch {
fmt.Println(val)
wg.Add(1)
//wg2.Add(1)
go func2(val, ch2, &wg)
//go func2(val, ch2, &wg2)
}
go func() {
wg.Wait()
//wg2.Wait()
close(ch2)
}()
for val := range ch2 {
fmt.Println(val)
}
}

func func1(seconds int, ch chan<- int, wg *sync.WaitGroup) {
defer wg.Done()
time.Sleep(time.Duration(seconds) * time.Second)
ch <- seconds
}

func func2(seconds int, ch chan<- string, wg *sync.WaitGroup) {
defer wg.Done()
ch <- "hello"
}


所以,你可以看到,如果我创建一个新的 WaitGroup 它工作正常,否则会出现死锁。

谢谢
暂时的
(一个 golang 菜鸟)

最佳答案

WaitGroup can be safely重用但不清楚为什么要为此使用第三方包?特别是如果您刚刚学习并发,我强烈建议您坚持使用标准库 - sync.WaitGroup 就是您所需要的。

FWIW,如果我修改您的代码以使用 sync.WaitGroup,它不会死锁并运行到完成 - 请参阅 this playground

This Go blog post解释如何使用 channel 安全地进行流水线操作,以及在一些更高级的情况下 WaitGroup (您并不总是需要它们)

关于go - 等待完成后我们是否需要创建新的 WaitGroup ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54606478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com