假设我使用 aWaitGroup
让应用程序的主线程等待,直到我从所述 main 启动的所有 goroutine 都完成。
是否有一种安全、直接的方法可以随时评估有多少与 say 相关的 goroutineWaitGroup
仍在运行?
假设我使用 aWaitGroup
让应用程序的主线程等待,直到我从所述 main 启动的所有 goroutine 都完成。
是否有一种安全、直接的方法可以随时评估有多少与 say 相关的 goroutineWaitGroup
仍在运行?
内部状态WaitGroup
不暴露,也不会暴露:https ://github.com/golang/go/issues/7202
我认为我们不太可能让这个 API 变得更复杂。除了简单地将它们打印出来之外,我看不到任何使用不受竞争条件约束的柜台和服务员的方法。为此,您可以保持自己的计数。
您可以自己实现一个计数器:
type WaitGroupCount struct {
sync.WaitGroup
count int64
}
func (wg *WaitGroupCount) Add(delta int) {
atomic.AddInt64(&wg.count, int64(delta))
wg.WaitGroup.Add(delta)
}
func (wg *WaitGroupCount) Done() {
atomic.AddInt64(&wg.count, -1)
wg.WaitGroup.Done()
}
func (wg *WaitGroupCount) GetCount() int {
return int(atomic.LoadInt64(&wg.count))
}
// Wait() promoted from the embedded field
但是,即使计数器访问是同步的,它也会在您读取它后立即变得陈旧,因为其他 goroutine 可能会继续调用Add
或Done
不管您对计数做什么 - 除非您同步依赖于计数的整个操作. 但在这种情况下,您可能需要一个更复杂的数据结构。
是否有一种安全、直接的方法可以随时评估与所述等待组相关联的 goroutine 仍在运行的数量?
不,没有。
仅仅因为 Go(语言)没有“与 [a] 等待组相关的 goroutines”的概念。