我有一个代码,其中单个 goroutine 将触发不确定数量的子 goroutine,这反过来将触发更多 goroutine,等等。我的目标是等待所有子 goroutine 完成。我不知道我将提前触发的 goroutine 的总数,所以我不能使用sync.WaitGroup,理想情况下我不必人为地限制通过channel-as-semaphore模式运行的 goroutine 的总数.简而言之,我想在每个 goroutine 中都有一个本地通道或等待组,作为等待其所有子进程的信号量,但这导致每个 goroutine 在其所有后代完成时都在消耗堆栈空间。现在我的想法是在 goroutine 被触发时增加一个原子计数器(在父级中,如果子级在父级完成后开始运行,以避免虚假地为零),当一个 goroutine 完成时递减它,并定期检查它是否相等到零。我基本上是在正确的轨道上,还是有更优雅的解决方案?
3 回答
catspeake
TA贡献1111条经验 获得超0个赞
当然,您可以将其sync.WaitGroup
用于您的任务,它实际上非常适合,专为此而设计。您将创建的 goroutine 的数量不是不确定的。它只是一个只有在运行时才知道的值,然后它就被精确地知道了。每一条go
语句都会创建一个新的 goroutine。在这样的go
语句之前,无论执行多少次,你都必须做
wg.Add(1)
并在每个 goroutine 中放入
defer wg.Done()
作为第一个声明。现在你可以做
wg.Wait
等待所有goroutine 完成。
- 3 回答
- 0 关注
- 189 浏览
添加回答
举报
0/150
提交
取消