假设我使用`WaitGroup`让应用程序的主线程等待我从该主线程启动的所有goroutine完成。那么,有没有一种安全、简单的方法,在任何时间点评估与该`WaitGroup`相关联的goroutine 中仍在运行的数量?
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
,无论你使用计数做什么 - 除非你同步依赖于计数的整个操作。但是在这种情况下,你可能需要一个更复杂的数据结构。
有没有一种安全、简单的方法,在任何时候评估与所述waitgroup相关联的goroutine的数量仍在运行?
不,没有。
这是因为Go(语言)没有“与waitgroup相关联的goroutine”的概念。