我有一个编程代码,其中单个 goroutine 将启动不确定数量的子 goroutine,这些子 goroutine 又会启动更多的 goroutine,以此类推。我的目标是等待所有子 goroutine 完成。
我无法预先知道要启动的 goroutine 总数,因此无法使用 sync.WaitGroup,理想情况下,也不希望通过 channel-as-semaphore 模式人为地限制运行的 goroutine 总数。
简要思考了一下,在每个 goroutine 中设置本地 channel 或 waitgroup 作为信号量,以等待其所有子 goroutine 完成,但结果是每个 goroutine 都在等待其所有后代 goroutine 完成时挂起,占用堆栈空间。
现在我的想法是增加 atomic counter,当goroutine被启动时(在父级中),递减它当goroutine结束时,并定期检查它是否等于零。
我无法预先知道要启动的 goroutine 总数,因此无法使用 sync.WaitGroup,理想情况下,也不希望通过 channel-as-semaphore 模式人为地限制运行的 goroutine 总数。
简要思考了一下,在每个 goroutine 中设置本地 channel 或 waitgroup 作为信号量,以等待其所有子 goroutine 完成,但结果是每个 goroutine 都在等待其所有后代 goroutine 完成时挂起,占用堆栈空间。
现在我的想法是增加 atomic counter,当goroutine被启动时(在父级中),递减它当goroutine结束时,并定期检查它是否等于零。
我基本上走在正确的轨道上了吗,还是有更优雅的解决方案?
go
语句之前再次调用'add'。 在go
之前只需添加.Add,并确保任何父级goroutine都在其自己的返回之前这样做。 这样可以确保每个“ Add ”到等待组发生在其关联的“ Done ”之前。 如果我没记错的话 ;-) - zzzzWaitGroup
就是一个有问题的、无用的东西,至少在这种情况下是这样的,你必须编写自己的替代品。对于造成的干扰,我很抱歉。稍后会删除我的回答。 - zzzz